У меня есть задача с постоянным подписчиком на тему JMS, и мне нужно иметь возможность перемещать эту задачу с одного хоста на другой.
Задача установила свой идентификатор клиента с помощью:
TopicConnection.setClientID ( "MyClient");
и
TopicSession.createDurableSubscriber (Тема,
"Прочный");
Для соответствующих экземпляров TopicConnection, TopicSession и Topic. Я использую подтверждение клиента, и каждое сообщение подтверждается после успешной обработки (в приведенном ниже примере выполнения ошибок не было).
У задачи всегда будет один и тот же идентификатор клиента (комбинация «MyClient» и «durable»).
Однако создается впечатление, что этот же идентификатор клиента рассматривается как отдельный для каждого хоста.
Итак, я получаю следующий сценарий:
- На хосте А работает подписчик.
- Отправляются сообщения 1-10.
- Хост A получает сообщения 1-10 и отключает своего абонента (закрывая соединение)
- Отправляются сообщения 11-20.
- Хост B устанавливает подписчика с (очевидно) тем же идентификатором клиента
- Отправляются сообщения 21-30.
- Хост B получает сообщения 11-30 (и часто несколько предыдущих сообщений, казалось бы, наугад)
- Хост B отключает своего абонента
- Хост A снова настраивает своего абонента
- Хост А получает сообщения 11-30
Прав ли я, полагая, что идентификатор хоста каким-то образом включается в идентификатор клиента под капотом? И есть ли способ остановить это?
Я использую SwiftMQ, если такое поведение присуще этому решению.