同一JGroups Channel同时使用MessageDispatcher与普通异步Receiver的问题
JGroups 5.4.10中MessageDispatcher导致Receiver收不到消息的问题解答
这是预期行为,原因很明确:MessageDispatcher在实例化时会自动替换关联JChannel上已设置的Receiver,接管通道的消息处理逻辑——它本身就是为实现请求/响应、分散收集这类高层通信模式设计的,需要独占通道的消息处理权。
你在jchannel.connect()之前创建MessageDispatcher,相当于提前把原本设置的channelReceiver给覆盖了,后续通过jchannel.send()发送的消息会被MessageDispatcher内部处理,自然不会再触发你自己的Receiver回调,且该过程本身无错误,所以不会输出警告或报错。
关于是否需要独立JChannel:JGroups官方文档明确建议,当需要同时使用底层JChannel.send()的异步消息模式,和MessageDispatcher这类高层组件时,应为不同场景使用独立的JChannel实例。因为高层组件会深度接管通道的消息处理逻辑,和底层Receiver模式无法兼容共用同一个通道。
如果不想用独立通道,也可以在自定义的JGroupsMemberHandler(传给MessageDispatcher的Handler)里,把收到的消息手动转发给原来的channelReceiver,但这种方式不够规范,容易引发逻辑混乱,更推荐使用独立通道的方案。
内容的提问来源于stack exchange,提问作者Thomas Mortagne
相关产品推荐
相关产品推荐

