SI订阅了多个mqtt主题

时间:2019-01-25 10:18:26

标签: spring-integration mqtt spring-integration-mqtt

我正在尝试学习如何在 Spring-Integration 中处理 MQTT消息。 已创建一个转换器,每个MQTT主题都订阅一个MqttPahoMessageDrivenChannelAdapter来转换和使用消息。

问题在于我们的数据提供商正计划“加快”他一方的发布消息。因此,计划将其中的每个字段发布到单独的MQTT主题,而不是只包含几个主题(<= 10),每个主题都具有大约150个字段的消息。

这意味着我的转换器将不得不消耗大约。 1000个mqtt主题,但我不知道是否:

  1. 弹簧集成仍然是一个不错的选择。造成afaik。提到的适配器使用PAHO MqttClient,它将在一个线程中使用它订阅的所有主题的消息,而创建这些适配器的1000个实例实在是过头了。
  2. 如果我们进一步坚持弹簧整合并使用所提供的组件,那么为所有字段创建单个入站适配器是一个好主意吗?以前,所有字段都在一个主题的消息中,但是将转换远离了将适配器bean转换为与执行程序通道连接到适配器的单独bean(进行转换),从而在某个线程池上并行执行这些字段的转换。

在此先感谢您的回答!

1 个答案:

答案 0 :(得分:0)

我认为您的想法很有意义。

为此,您需要实现 passthrough MqttMessageConverter并提供MqttMessage作为payloadtopic作为标头:< / p>

public class PassThroughMqttMessageConverter implements MqttMessageConverter {

    @Override
    public Message<?> toMessage(String topic, MqttMessage mqttMessage) {
        return MessageBuilder.withPayload(mqttMessage)
                .setHeader(MqttHeaders.RECEIVED_TOPIC, topic)
                .build();
    }

    @Override
    public Object fromMessage(Message<?> message, Class<?> targetClass) {
        return null;
    }

    @Override
    public Message<?> toMessage(Object payload, MessageHeaders headers) {
        return null;
    }

}

因此,在自定义ExecutorChannel中提到transformer之后,您真的将能够在下游执行目标转换。

您还可以考虑实现自定义MqttPahoClientFactory(也可以使用DefaultMqttPahoClientFactory的扩展名),并提供自定义ScheduledExecutorService注入MqttClient中您将在getClientInstance()中创建。