Узлы Hazelcast не получают первое опубликованное сообщение - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть два узла.Оба подписаны на тему.

Когда один из узлов публикует сообщение, другой не получает сообщение в первый раз.Если узел публикует сообщение во второй раз, то другой узел получает сообщение.

Если я вызываю hazelcastInstance.getTopic (TopicX) на этапе инициализации приложения, прослушиватели сообщений работают так, как нужно.

Я думаю, что речь идет об атрибуте lazy-init.

Есть ли более надежный способ не сталкиваться с этой проблемой?Надежная тема может быть решением ??Если да, есть ли пример кода для реализации надежной темы с пружиной?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

@ gokhan-oner, спасибо за ответ.

На самом деле я сначала попытался реализовать надежную тему.Но я не смог найти образец реализации весной.Синтаксис немного отличается весной.Теперь реализация выполняется следующим образом:

 <hz:hazelcast id="instance">
    <hz:ringbuffer name="topicX" capacity="1000" time-to-live-seconds="5"/>
    <hz:ringbuffer name="topicY" capacity="1000" time-to-live-seconds="5"/>
    <hz:reliable-topic name="topicX" topic-overload-policy="BLOCK"/>
    <hz:reliable-topic name="topicY" topic-overload-policy="BLOCK"/>
</hz:hazelcast>

Но декларативная реализация прослушивателей тем не работает.Я добавил слушателей программно, когда контекст инициализируется.

Что у меня не работает:

<hz:reliable-topic name="topicZ" topic-overload-policy="BLOCK">
    <hz:message-listeners>
        <hz:message-listener class-name="tr.com.test.HazelcastTopicListener"/>
    </hz:message-listeners>
</hz:reliable-topic>

Что работает:

HazelcastTopicListener hazelcastTopicListener = new HazelcastTopicListener();
HazelcastInstance hazelcastInstance = SpringIntegration.getBean(HazelcastInstance.class);
ITopic<Message> testTopic= hazelcastInstance.getTopic("topicZ");
testTopic.addMessageListener(hazelcastTopicListener );
0 голосов
/ 13 февраля 2019

@ vourla, пожалуйста, проверьте файл hazelcast-spring-XX.xsd.Имя атрибута class-or-bean-name, а не class-name.Можете ли вы попробовать, как показано ниже:

<hz:reliable-topic name="topicZ" topic-overload-policy="BLOCK">
    <hz:message-listeners>
        <hz:message-listener class-or-bean-name="tr.com.test.HazelcastTopicListener"/>
    </hz:message-listeners>
</hz:reliable-topic>
0 голосов
/ 07 февраля 2019

@ vourla, я бы посоветовал использовать ReliableTopic, поскольку он поддерживается RingBuffer и пока резервный кольцевой буфер не заполнен, слушатели могут правильно прочитать первое сообщение.

Также см. Соответствующий раздел документации:https://docs.hazelcast.org/docs/3.11.1/manual/html-single/index.html#configuring-reliable-topic

Вместо программного добавления слушателя, добавьте его через конфигурацию.Кроме того, для Topic, поскольку события запускаются и забываются, если вы добавите прослушиватель после того, как событие запущено с другого узла, вы не получите его, определяете ли вы его программно или через config, но с ReliableTopic оба должны работать.

Вы также можете проверить раздел документации Spring и примеры кода: https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/spring-configuration

...