Spring Mqtt - 以编程方式向多个主题发布消息
Spring Mqtt - Publish messages to multiple topics programmatically
如何以编程方式发布不同主题的消息?
<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" />
我试过 ,但无法配置。
还尝试了 MqttPahoMessageHandlerAdapter
,它有 publish()
但 protected
。
使用 org.eclipse.paho.client.mqttv3.MqttAsyncClient
和 org.eclipse.paho.client.mqttv3.MqttCallback
非常容易。但我想一直坚持spring。
如果有人能指出正确的方向,我将不胜感激。
无论如何,您都可以通过 Spring 集成来做到这一点!拥有大量 EIP 组件实现和 Spring 机载电源(注入、SpEL 等),再加上一点想象力,即使没有任何 Java 代码,我们也可以达到任何最终应用要求。
因此,<mqtt:outbound-channel-adapter>
允许在运行时确定 topic
。您应该提供 MqttHeaders.TOPIC
MessageHeader
而不是 default-topic
。
因此,如果您需要向多个主题发送相同的消息,您只需为每个主题构建该消息的副本。 <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
实现并行发布。
更新
您可以在 <splitter>
上使用 ref
和 method
使用类似的 Java 代码实现相同的迭代和消息丰富逻辑。
当然,即使使用 SpEL 我们也可以做到这一点,但是使用 Collection Projection
.
看起来会有点复杂
声明一个<publish-subscribe-channel id="toMqtt" />
;将其设置为每个出站通道适配器上的 channel
属性;消息将发送到每个适配器。
如何以编程方式发布不同主题的消息?
<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" />
我试过
还尝试了 MqttPahoMessageHandlerAdapter
,它有 publish()
但 protected
。
使用 org.eclipse.paho.client.mqttv3.MqttAsyncClient
和 org.eclipse.paho.client.mqttv3.MqttCallback
非常容易。但我想一直坚持spring。
如果有人能指出正确的方向,我将不胜感激。
无论如何,您都可以通过 Spring 集成来做到这一点!拥有大量 EIP 组件实现和 Spring 机载电源(注入、SpEL 等),再加上一点想象力,即使没有任何 Java 代码,我们也可以达到任何最终应用要求。
因此,<mqtt:outbound-channel-adapter>
允许在运行时确定 topic
。您应该提供 MqttHeaders.TOPIC
MessageHeader
而不是 default-topic
。
因此,如果您需要向多个主题发送相同的消息,您只需为每个主题构建该消息的副本。 <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
实现并行发布。
更新
您可以在 <splitter>
上使用 ref
和 method
使用类似的 Java 代码实现相同的迭代和消息丰富逻辑。
当然,即使使用 SpEL 我们也可以做到这一点,但是使用 Collection Projection
.
声明一个<publish-subscribe-channel id="toMqtt" />
;将其设置为每个出站通道适配器上的 channel
属性;消息将发送到每个适配器。