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