2016-12-16 19 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を追加して、複数のトピックに送信しました。

@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確認を待つが、アプリケーションイベントとして後で確認を公開しないように(trueasync設定)MqttAsyncClientを使用して構成することができます。

独自のコードを使用してループ内で複数のメッセージを送信している場合は、非同期クライアントを使用して後でIMqttDeliveryToken補完を待つほうが速いでしょう。

+0

「MqttPahoMessageHandler」は、どのようなトピックにも送信できるように設定できますか?ここでは、私は1つのトピック 'messageHandler.setDefaultTopic(settings.getMqttPublishTopic());'にrestrctedされています。この制限を取り除き、 'void sendToMqtt(String topicName、String payload); 'のようなメソッドを持つことはできますか?私はメッセージを送るたびにトピック名を指定します。 – Raj

+0

[ドキュメント](http://docs.spring.io/spring-integration/reference/html/mqtt.html#CO39-7)に記載されているとおり、これは__default__トピックです。メッセージが 'mqtt_topic'ヘッダー(定数' MqttHeaders.TOPIC')を含んでいない場合にのみ使用されます。ヘッダーを豊富にするなど、ヘッダーを追加することができます。ヘッダーを追加するには、 '@ Gateway'メソッドまたはゲートウェイメソッド自体の式を持つ' @ GatewayHeader'を使用します。 'void sendToMqtt(String payload、@Header(MqttHeaders .TOPIC)文字列トピック); '。 –

+0

@GaryRussellは、sendToMqttで複数のトピックを使用することが可能です。 – Gkan

関連する問題