Hazelcast 节点未获得第一条发布的消息
Hazelcast nodes not get the first published message
我有两个节点。他们都订阅了一个主题。
当一个节点发布消息时,另一个节点没有第一时间收到消息。如果该节点第二次发布消息,则另一个节点将获得该消息。
如果我在应用程序初始化阶段调用 hazelcastInstance.getTopic(TopicX),消息侦听器将按预期工作。
我认为是关于 lazy-init 属性。
有没有更靠谱的方法不去面对这个问题?可靠的主题可能是解决方案?如果是这样,是否有任何示例代码来实现 spring 的可靠主题?
@vourla,我建议使用 ReliableTopic,因为它由 RingBuffer 支持,只要支持的 ringbuffer 未满,听众就可以正确阅读第一条消息。
此外,请参阅相关文档部分:https://docs.hazelcast.org/docs/3.11.1/manual/html-single/index.html#configuring-reliable-topic
不是以编程方式添加侦听器,而是通过配置添加它。此外,对于主题,由于事件是触发后遗忘的,如果您在从另一个节点触发的事件之后添加侦听器,您将无法获得它,无论您是通过编程方式还是通过配置定义它,但对于 ReliableTopic,两者都应该有效。
您还可以查看 Spring 相关文档部分和相关代码示例:https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/spring-configuration
@gokhan-oner,谢谢你的回答。
其实我一开始尝试实现reliable-topic。但是我在 spring 中找不到示例实现。 spring 中的语法略有不同。
现在,实现是这样完成的:
<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>
我有两个节点。他们都订阅了一个主题。
当一个节点发布消息时,另一个节点没有第一时间收到消息。如果该节点第二次发布消息,则另一个节点将获得该消息。
如果我在应用程序初始化阶段调用 hazelcastInstance.getTopic(TopicX),消息侦听器将按预期工作。
我认为是关于 lazy-init 属性。
有没有更靠谱的方法不去面对这个问题?可靠的主题可能是解决方案?如果是这样,是否有任何示例代码来实现 spring 的可靠主题?
@vourla,我建议使用 ReliableTopic,因为它由 RingBuffer 支持,只要支持的 ringbuffer 未满,听众就可以正确阅读第一条消息。
此外,请参阅相关文档部分:https://docs.hazelcast.org/docs/3.11.1/manual/html-single/index.html#configuring-reliable-topic
不是以编程方式添加侦听器,而是通过配置添加它。此外,对于主题,由于事件是触发后遗忘的,如果您在从另一个节点触发的事件之后添加侦听器,您将无法获得它,无论您是通过编程方式还是通过配置定义它,但对于 ReliableTopic,两者都应该有效。
您还可以查看 Spring 相关文档部分和相关代码示例:https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/spring-configuration
@gokhan-oner,谢谢你的回答。
其实我一开始尝试实现reliable-topic。但是我在 spring 中找不到示例实现。 spring 中的语法略有不同。 现在,实现是这样完成的:
<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>