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