【问题标题】:Multi MQTT clients subscribed to the same topic多个 MQTT 客户端订阅同一个主题
【发布时间】:2020-12-19 17:23:46
【问题描述】:

我实际上有一个带有订阅主题的 MQTT 客户端的 Spring Boot 应用程序。

我在放置 2 个应用程序实例(2 个容器/pod)时遇到问题,因为它创建了 2 个与发布者的连接! 问题是我在数据库中记录每条消息的内容,所以我收到了 2 次数据!一个来自一个 pod,一个来自第二个......所以数据库中有 2 条记录......

这是我的实际代码:

.
..
...
....
    @Bean
    public MqttConnectOptions getReceiverMqttConnectOptions() {
        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setCleanSession(true);
        mqttConnectOptions.setConnectionTimeout(30);
        mqttConnectOptions.setKeepAliveInterval(60);
        mqttConnectOptions.setAutomaticReconnect(true);

        mqttConnectOptions.setUserName(bean.getProperty("username"));
        String password = bean.getProperty("password");
        String hostUrl = bean.getProperty("url");

        mqttConnectOptions.setPassword(password.toCharArray());
        mqttConnectOptions.setServerURIs(new String[] { hostUrl });
        return mqttConnectOptions;
    }

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getReceiverMqttConnectOptions());
        return factory;
    }

    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageProducer inbound() {
        String clientId = "client-id" + UUID.randomUUID().toString();
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory(), "jenkins");
        adapter.setCompletionTimeout(20000);
        adapter.setConverter(new DefaultPahoMessageConverter());
...
..
.

如果你们中的任何人有一个解决方案,可以在不创建 2 个 MQTT 连接的情况下使用我的应用程序的 2 个 pod。谢谢

【问题讨论】:

  • 你的意思是你真的有 2 个客户订阅了同一个主题,所以他们都收到了相同的消息?
  • 是的,2 个 pod(容器),所以 2 个客户端订阅了相同的主题。所以是的,他们每个人都会收到一条消息:(

标签: java spring-boot kubernetes openshift mqtt


【解决方案1】:

您需要使用支持共享订阅的代理(这是添加到 MQTTv5 标准的功能,但有些代理在 v3 时不支持标准版本)

共享订阅允许客户端组订阅某个主题(或通配符主题),并且发布到该主题的任何给定消息只会传递给客户端组中的一个。

您可以阅读更多关于共享订阅here

【讨论】:

  • 你是对的,谢谢你的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多