Spring-启动MQTT配置
Spring-Boot MQTT Configuration
我需要将负载发送到许多设备,这些设备的名称是从数据库中挑选出来的。然后,我必须发送到不同的主题,就像 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);
}
哪个有效。
但我的问题是,我能否实现同样的效果,使用输出通道以获得更好的性能?如果是,非常感谢任何帮助。谢谢。
MqttClient
是同步的。
MqttPahoMessageHandler
使用 MqttAsyncClient
并且可以配置(将 async
设置为 true
)不等待确认,但稍后将确认发布为应用程序事件。
如果您使用自己的代码并循环发送多条消息,使用异步客户端可能会更快,然后等待 IMqttDeliveryToken
完成。
我需要将负载发送到许多设备,这些设备的名称是从数据库中挑选出来的。然后,我必须发送到不同的主题,就像 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);
}
哪个有效。
但我的问题是,我能否实现同样的效果,使用输出通道以获得更好的性能?如果是,非常感谢任何帮助。谢谢。
MqttClient
是同步的。
MqttPahoMessageHandler
使用 MqttAsyncClient
并且可以配置(将 async
设置为 true
)不等待确认,但稍后将确认发布为应用程序事件。
如果您使用自己的代码并循环发送多条消息,使用异步客户端可能会更快,然后等待 IMqttDeliveryToken
完成。