У меня есть требование отправить полезную нагрузку на множество устройств, чьи имена выбраны из базы данных. Затем мне нужно отправить разные темы, которые будут похожи на settings/{put devicename here}
.Spring-Boot Конфигурация MQTT
Ниже приведена конфигурация, которую я использовал, которую я получил из справочных документов весны-загрузки.
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
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);
}
Который работает.
Но мой вопрос: Могу ли я достичь того же, используя выходной канал для лучшей производительности? Если да, то любая помощь очень ценится. Спасибо.
Может ли 'MqttPahoMessageHandler' настроить отправку на любую тему, которая мне нравится? Здесь я привязан к 1 теме 'messageHandler.setDefaultTopic (settings.getMqttPublishTopic());'. Могу ли я удалить это ограничение и иметь метод типа void sendToMqtt (String topicName, String)? '? Где я указываю имя темы каждый раз, когда я отправляю сообщение. – Raj
Как указано в [документации] (http://docs.spring.io/spring-integration/reference/html/mqtt.html#CO39-7), это тема __default__; он используется только в том случае, если сообщение не содержит заголовок 'mqtt_topic' (константа' MqttHeaders.TOPIC'). Вы можете добавить заголовок несколькими способами - например, с расширителем заголовка, '@ GatewayHeader' с выражением в методе' @ Gateway' или в самом методе шлюза: 'void sendToMqtt (String payload, @Header (MqttHeaders) .TOPIC) Тема строки); '. –
@GaryRussell - это возможность использовать несколько тем с sendToMqtt, если это можно объяснить? – Gkan