Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个MQTT客户端订阅了同一主题_Java_Spring Boot_Kubernetes_Openshift_Mqtt - Fatal编程技术网

Java 多个MQTT客户端订阅了同一主题

Java 多个MQTT客户端订阅了同一主题,java,spring-boot,kubernetes,openshift,mqtt,Java,Spring Boot,Kubernetes,Openshift,Mqtt,实际上,我有一个spring引导应用程序,其中有一个MQTT客户机,订阅了这个主题 当我放置应用程序的两个实例(两个容器/吊舱)时,我遇到了一个问题,因为它创建了两个到发布者的连接! 问题是我在数据库中记录了每条消息的内容,所以我收到了2次数据!一个来自吊舱,另一个来自第二个…所以2记录在数据库中 这是我的实际代码: . .. ... .... @Bean public MqttConnectOptions getReceiverMqttConnectOptions() {

实际上,我有一个spring引导应用程序,其中有一个MQTT客户机,订阅了这个主题

当我放置应用程序的两个实例(两个容器/吊舱)时,我遇到了一个问题,因为它创建了两个到发布者的连接! 问题是我在数据库中记录了每条消息的内容,所以我收到了2次数据!一个来自吊舱,另一个来自第二个…所以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连接。。谢谢

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

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


您可以阅读有关共享订阅的更多信息

您的意思是,您确实有两个客户端订阅了相同的主题,因此都接收相同的消息?是的,两个pod(容器)因此有两个客户端订阅了相同的主题。因此,是的,他们会收到每个人的一条信息:(你说得对,谢谢你提供的信息!