我有两个节点。他们两个都订阅了一个话题。
当其中一个节点发布一条消息时,另一个节点第一次未收到该消息。如果该节点第二次发布消息,则另一个节点将获得该消息。
如果我在应用程序初始化阶段调用hazelcastInstance.getTopic(TopicX),则消息侦听器将根据需要工作。
我认为这与lazy-init属性有关。
有没有更可靠的方法可以解决这个问题?可靠的话题可能是解决方案?如果是这样,是否有示例代码可以用spring实现可靠的主题?
答案 0 :(得分:0)
@vourla,我建议您使用ReliableTopic,因为它由RingBuffer支持,并且只要支持ringbuffer尚未满,收听者就可以正确读取第一条消息。
另外,请参阅相关文档部分:https://docs.hazelcast.org/docs/3.11.1/manual/html-single/index.html#configuring-reliable-topic
不是通过编程方式添加侦听器,而是通过配置添加它。另外,对于Topic,由于事件是触发事件而忘记了事件,因此,如果在从另一个节点触发事件之后添加侦听器,则无论是通过程序定义还是通过config进行定义,都无法使用它。 >
您还可以查看Spring相关文档部分和相关代码示例:https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/spring-configuration
答案 1 :(得分:0)
@ 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 );
答案 2 :(得分:0)
@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>