【问题标题】:Spring-Boot MQTT ConfigurationSpring-Boot MQTT 配置
【发布时间】:2017-05-02 08:18:50
【问题描述】:

我需要将有效负载发送到许多名称是从数据库中挑选出来的设备。然后,我必须发送到不同的主题,例如settings/{put devicename here}。

以下是我从 spring-boot 参考文档中获得的配置。

MQTTConfiguration.java

@Configuration
@IntegrationComponentScan
public class MQTTConfiguration {

@Autowired
private Settings settings;
@Autowired
private DevMqttMessageListener messageListener;

@Bean
MqttPahoClientFactory mqttClientFactory() {
    DefaultMqttPahoClientFactory clientFactory = new DefaultMqttPahoClientFactory();
    clientFactory.setServerURIs(settings.getMqttBrokerUrl());
    clientFactory.setUserName(settings.getMqttBrokerUser());
    clientFactory.setPassword(settings.getMqttBrokerPassword());
    return clientFactory;
}

@Bean
MessageChannel mqttOutboundChannel() {
    return new DirectChannel();
}

@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
    MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("dev-client-outbound",
            mqttClientFactory());
    messageHandler.setAsync(true);
    messageHandler.setDefaultTopic(settings.getMqttPublishTopic());
    return messageHandler;
}

@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface DeviceGateway {
    void sendToMqtt(String payload);
}
}

在这里,我只发送 1 个主题。所以我添加了如下 bean 以发送到多个主题;

@Bean
public MqttClient mqttClient() throws MqttException {
    MqttClient mqttClient = new MqttClient(settings.getMqttBrokerUrl(), "dev-client-outbound");
    MqttConnectOptions connOptions = new MqttConnectOptions();
    connOptions.setUserName(settings.getMqttBrokerUser());
    connOptions.setPassword(settings.getMqttBrokerPassword().toCharArray());
    mqttClient.connect(connOptions);
    return mqttClient;
}

我发送使用,

try {       
    mqttClient.publish(settings.getMqttPublishTopic()+device.getName(), mqttMessage);
    } catch (MqttException e) {
        LOGGER.error("Error While Sending Mqtt Messages", e);
    }

哪个有效。

但我的问题是,我可以使用输出通道获得更好的性能吗?如果是,任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: spring spring-boot spring-integration mqtt paho


    【解决方案1】:

    MqttClient 是同步的。

    MqttPahoMessageHandler 使用MqttAsyncClient 并且可以配置(将async 设置为true)不等待确认,但稍后将确认作为应用程序事件发布。

    如果您使用自己的代码并在循环中发送多条消息,则使用异步客户端可能会更快,然后等待IMqttDeliveryToken 完成。

    【讨论】:

    • 可以将MqttPahoMessageHandler 配置为发送到我喜欢的任何主题吗?在这里,我被限制为 1 个主题 messageHandler.setDefaultTopic(settings.getMqttPublishTopic());。我可以删除此限制并使用void sendToMqtt(String topicName, String payload); 之类的方法吗?我每次发送消息时都指定主题名称。
    • 如the documentation 中所述,这是一个默认主题;它仅在消息不包含mqtt_topic 标头(常量MqttHeaders.TOPIC)时使用。您可以通过多种方式添加标头 - 例如,使用标头丰富器、@GatewayHeader 以及 @Gateway 方法或网关方法本身的表达式:void sendToMqtt(String payload, @Header(MqttHeaders.TOPIC) String topic);。
    • @GaryRussell 是否可以通过 sendToMqtt 使用多个主题,如果可以的话,您能解释一下吗?
    • 如果它与这个不同,您需要提出一个新问题。此处不允许 cmets 中的扩展对话框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2016-01-09
    • 2015-12-26
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多