我有一个JMS发布者,我无法更改(外部系统)。此发布者将消息发布到某个预定义的JMS队列中。我想设计一个多节点订户系统,其中所有订阅节点都将收到每条消息的副本(在我的设计中,订阅者节点能够通过检查消息中的某些属性来实现消息是否针对此节点因此,只有一个订户节点最终将处理该消息,而其他订户节点将丢弃其副本)。
将发布商系统更改为使用主题可以完美运行,但我无法更改发布者。
目前,我认为有两种方法可以解决这个问题:
可能有效的一个选项是使用QueueBrowser,实现定期轮询,读取所有消息,如果消息是“我的”,则从队列和进程中删除消息。对于这样一个简单的问题,这是一个巨大的开销。
另一个选择是编写一个订阅队列,并将每条消息发送给多个“内部”订阅者(例如,如下所述:JMS - Going from one to multiple consumers)。但这会在调度员中造成瓶颈,从而导致整个可扩展性的想法。
第三种选择是让多个“中间”队列订阅者,每个订阅者在收到消息时,将其重新发布到目标订阅者将订阅的主题。这可以工作,但它是流程中的额外跳跃,所以不确定利益(可伸缩性)是否值得损失(延迟和复杂性)。
我想知道是否还有其他想法可以解决这个问题。
感谢。
答案 0 :(得分:0)
Take a look at JMS routing using Apache CAMEL
<camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring">
<!-- simple bridge from a topic to queue -->
<route>
<from uri="activemq:topic:topic.HelloWorld.incoming"> <to uri="activemq:queue:queue.HelloWorld">
</route>
</camelContext>
答案 1 :(得分:0)
使用Oracle Service Bus,您可以将队列路由到您在上面#2中提到的主题。它是一个可选的中间件,可以与Weblogic一起安装。它具有JMS和Web服务的各种路由选项。
这是一个快速浏览: http://www.orafmwschool.com/oracle-service-bus-routing-and-transformation/
http://www.slideshare.net/gschmutz/where-andwhentousetheoracleservicebusv2
我们正在将它用于您正在寻找的非常相同的目的。