На самом деле у меня есть приложение весенней загрузки с клиентом MQTT, которое подписано на тему.
Я сталкиваюсь с проблемой, когда помещаю 2 экземпляра своего приложения (2 контейнера/модуля), потому что оно создает 2 подключения к издателю! Проблема в том, что я записываю вещи в базу данных для каждого сообщения, поэтому я получаю данные 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 модуля моего приложения без создания 2 соединений MQTT. Спасибо.
Да, 2 модуля (контейнера), поэтому 2 клиента подписались на одну и ту же тему. Так что да, они получают каждое сообщение :(
Вам необходимо использовать брокера, который поддерживает общие подписки (эта функция добавлена в стандарт MQTTv5, но некоторые брокеры не поддерживали стандартные версии в v3)
Общие подписки позволяют группам клиентов подписываться на тему (или тему с подстановочными знаками), и любое данное сообщение, опубликованное в этой теме, будет доставлено только одному из группы клиентов.
Подробнее об общих подписках можно прочитать здесь
Вы правы, спасибо за информацию!
Вы имеете в виду, что у вас действительно есть 2 клиента, которые подписались на одну и ту же тему, поэтому оба получают одни и те же сообщения?