2016-12-16 6 views
0

У меня есть требование отправить полезную нагрузку на множество устройств, чьи имена выбраны из базы данных. Затем мне нужно отправить разные темы, которые будут похожи на 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); 
    } 

Который работает.

Но мой вопрос: Могу ли я достичь того же, используя выходной канал для лучшей производительности? Если да, то любая помощь очень ценится. Спасибо.

ответ

4

MqttClient является синхронным.

MqttPahoMessageHandler использует MqttAsyncClient и может быть настроен (установлен async к true), чтобы не ждать подтверждения, но опубликовать подтверждение позже как событие приложения.

Если вы используете свой собственный код и отправляете несколько сообщений в цикле, скорее всего, будет быстрее использовать асинхронный клиент и дождаться завершений IMqttDeliveryToken.

+0

Может ли 'MqttPahoMessageHandler' настроить отправку на любую тему, которая мне нравится? Здесь я привязан к 1 теме 'messageHandler.setDefaultTopic (settings.getMqttPublishTopic());'. Могу ли я удалить это ограничение и иметь метод типа void sendToMqtt (String topicName, String)? '? Где я указываю имя темы каждый раз, когда я отправляю сообщение. – Raj

+0

Как указано в [документации] (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) Тема строки); '. –

+0

@GaryRussell - это возможность использовать несколько тем с sendToMqtt, если это можно объяснить? – Gkan