У меня есть настройка Hazelcast с 3 участниками (версия 3.11). Каждый участник определяет тему, которую он использует для получения ответов от других участников:
int myServerId = ...
MessageListener<Response> listener = ...
TopicConfig cfg = new TopicConfig( "response-" + myServerId );
cfg.addMessageListener( listener );
Когда один из других участников получает запрос (по отдельной надежной теме), он обрабатывает его и отправляет ответ:
UUID correlationId = ...
Response response = ...
ITopic<Response> responseTopic = hazelcastInstance.getTopic( "response-" + fromServerId );
responseTopic.publish( response );
LOG.debug( "Sent response fromServerId={}, toServerId={}, correlationId={}: {}", myServerId, requestingServerId, correlationId, response );
Вернувшись на исходный узел, я отправляю 3-5 сообщений в быстрой последовательности. На принимающем узле я вижу тех, кто приходит, обрабатывается и публикует ответы на тему:
2018-10-31 13:42:45,326 DEBUG [REMOTE] (connection-2) Sent response fromServerId=2, toServerId=1, correlationId=159153cf-636d-4165-8b48-8ffcbcf33ffa: ...
Но тогда на исходном узле я вижу только некоторые входящие сообщения. Иногда это 1 из 5, которые этого не делают. В других случаях они все делают это.
Я попытался определить все 3 темы (response-1, response-2, response-3) в конфигурации и определить слушателя только по одной из тем (соответствующих serverId) без видимой разницы. Я также попытался добавить слушатель после запуска HazelcastInstance без каких-либо улучшений.
Затем я сделал комбинацию из двух (определите все темы, но зарегистрируйте слушателя, как только HazelcastInstance будет запущен и доступен. Без изменений.
Проблема исчезает, когда я применяю свой первоначальный подход, заключающийся в том, чтобы определить тему ровно один раз для каждого участника, включая слушателя, и изменить ее, чтобы я определял все темы для всех участников и добавлял прослушивателя для каждого узла только после того, как установлен HazelcastInstance.