2

如何以编程方式发布具有不同主题的消息?

<mqtt:outbound-channel-adapter id="mqttOut" 
    auto-startup="true" 
    client-id="foo"
    url="tcp://localhost:1883"
    client-factory="clientFactory"
    default-qos="0"
    default-retained="false"
    default-topic="bar"
    async="true"
    async-events="true" />

我尝试了 Spring 集成 MQTT 发布和订阅多个主题,但无法配置。

也试过MqttPahoMessageHandlerAdapterwhich has a publish()but protected

org.eclipse.paho.client.mqttv3.MqttAsyncClientorg.eclipse.paho.client.mqttv3.MqttCallback容易。但我想一直坚持春天。

感谢有人能指出我正确的方向。

4

2 回答 2

2

无论如何,您都可以使用 Spring Integration 做到这一点!拥有大量 EIP 组件实现和板载 Spring 功能(注入、SpEL 等),再加上一点想象力,即使没有任何 Java 代码,我们也可以达到任何最终应用程序的要求。

因此,<mqtt:outbound-channel-adapter>允许topic在运行时确定。而不是default-topic你应该提供MqttHeaders.TOPIC MessageHeader.

因此,如果您需要将相同的消息发送到多个主题,您只需为每个主题构建该消息的副本。<splitter>可以帮助我们:

<int:splitter input-channel="enricheMessage" output-channel="sendMessage" apply-sequence="false">
    <int-groovy:script>
        ['topic1', 'topic2', 'topic3'].collect {
            org.springframework.integration.support.MessageBuilder.withPayload(payload)
                    .copyHeaders(headers)
                    .setHeader(org.springframework.integration.mqtt.support.MqttHeaders.TOPIC, it)
                    .build()
        }
    </int-groovy:script>
</int:splitter>

sendMessage可以ExecutorChannel实现并行发布。

更新

ref您可以使用和methodon使用类似的 Java 代码实现相同的迭代和消息丰富逻辑<splitter>。当然,即使使用 SpEL 也可以做到这一点,但使用Collection Projection.

于 2015-05-09T07:42:01.660 回答
2

声明一个<publish-subscribe-channel id="toMqtt" />;将其设置为channel每个出站通道适配器上的属性;消息将被发送到每个适配器。

于 2015-05-09T07:42:56.030 回答