java—订阅同一主题的多mqtt客户机

ifsvaxew  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(900)

实际上,我有一个spring引导应用程序,其中包含一个mqtt客户机,它订阅了topic。
当我放置我的应用程序的2个示例(2个容器/pod)时,我遇到了一个问题,因为它创建了2个到发布者的连接!问题是,我在数据库中记录了每条消息的内容,所以我接收了两次数据!一个来自吊舱,另一个来自第二个…数据库中的so 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 pod而不创建2 mqtt连接。。谢谢

nlejzf6q

nlejzf6q1#

您需要使用支持共享订阅的代理(这是mqttv5标准中添加的功能,但有些代理不支持v3的标准版本)
共享订阅允许多个客户端组订阅主题(或通配符主题),而发布到该主题的任何给定消息将仅传递给其中一个客户端组。
您可以在此处阅读有关共享订阅的更多信息

相关问题