Совместное использование одного и того же экземпляра MQTT-клиента между MqttPahoMessageHandler и MqttPahoMessageDrivenChannelAdapter в Spring Boot Integration - PullRequest
0 голосов
/ 15 октября 2019

Предположим, у меня есть одно приложение Spring Boot, которому нужно создать несколько клиентов MQTT (# ~ 10 ^ 4) для виртуализации физических устройств в брокер (Mosquitto). Каждый из них имеет уникальный идентификатор клиента, чтобы получать / отправлять сообщения от / к выделенным темам.

Я пытаюсь добиться этого, используя входящие / исходящие потоки интеграции MQTT в Spring Boot (spring -gration-mqtt-5.1.6.RELEASE), но каждый поток (MqttPahoMessageDrivenChannelAdapter/MqttPahoMessageHandler) создает собственный клиент для управления входящими / исходящими сообщениями.

Мои опасения:

  • По определениюЯ не могу использовать только один клиент для входного / выходного потока из-за структуры потоков интеграции Spring Boot MQTT.
  • Это может быть неэффективно, потому что мне нужны два разных клиента, следовательно, двойные ресурсы.
  • Я не могу использовать один и тот же идентификатор клиента для каждого «логического» канала, потому что я использую два разных клиента MQTT, и, как вы знаете, если вы пытаетесь подключиться к одному и тому же брокеру с тем же идентификатором клиента, самый старый из них отключается. Таким образом, мне нужны разные конфигурации (и авторизации на стороне сервера) для каждого логического потока ввода / вывода, чтобы отправлять и получать сообщения.
  • Приложение Spring Boot создает два раза соединения с сервером, поэтому сервер должен бытьразмер для приема входящих соединений в 2 раза, и это может быть проблемой.

Основная идея, которую я имею, состоит в том, чтобы переопределить MqttPahoMessageDrivenChannelAdapter и MqttPahoMessageHandler, чтобы позволить им совместно использовать тот же экземпляр MqttClient длятот же идентификатор клиента. Чтобы сделать это, я должен переопределить методы подключения / отключения / подписки внутри Адаптера и Обработчика, чтобы сделать их устойчивыми. Кроме того, я должен использовать выделенную фабрику клиентов, чтобы вернуть одного и того же клиента для одного и того же идентификатора клиента (это самая простая часть).

Теперь возникает вопрос: правильный ли это подход? Я изнасилую Spring Boot, пытаясь это сделать?

Единственная найденная мною альтернатива - это непосредственная реализация необработанных MqttClients, управление всем их жизненным циклом. Это работает, но я заново изобретаю колесо и не использую шаблон дизайна сообщений Spring Boot.

...