如何以编程方式发布包含不同主题的邮件?
<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 integration MQTT publish & subscribe to multiple topics,但无法配置。
还尝试MqttPahoMessageHandlerAdapter
publish()
但protected
。
使用org.eclipse.paho.client.mqttv3.MqttAsyncClient
和org.eclipse.paho.client.mqttv3.MqttCallback
非常简单。但我想一直坚持春天。
感谢有人能指出我正确的方向。
答案 0 :(得分: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
上的method
和<splitter>
,使用类似的Java代码实现相同的迭代和消息丰富逻辑。
当然,即使使用SpEL,我们也可以这样做,但Collection Projection
看起来有点复杂。
答案 1 :(得分:2)
宣布<publish-subscribe-channel id="toMqtt" />
;将其设置为每个出站通道适配器上的channel
属性;消息将被发送到每个适配器。