主题无法实现队列中的所有功能
答案 0 :(得分:1)
我遇到的主要要求是消费者无法在主题上竞争单个消息。例如,我有一个发布呼叫中心事件的客户。有几个系统订阅了这些事件。其中一个系统是实际的呼叫路由应用程序,它有多个实例在运行。如果每个实例都订阅,则呼叫将路由到所有实例。但是,如果将消息放入队列并且所有实例消耗掉相同的队列,则只有一个消息将接收该消息,并且该调用将转发给该运算符。如果发布应用程序从主题转换为队列,则呼叫中心可以正常工作,但所有其他订阅者应用程序都不会收到消息。
解决方案(在WebSphere MQ中实现)是为主题创建管理订阅,并将消息传递到所有应用程序实例都使用的队列。因此,制作人应用程序仍然是发布者,所有动态订阅者仍然可以获得消息的副本,并且呼叫中心应用程序实例竞争每个已发布消息的单个实例。
此外,您不能对某个主题使用浏览语义,而您可以在队列中使用。通过主题,您可以指定选择器来过滤返回的消息,但这是关于它的消息。使用队列,您可以浏览,重置浏览指针,然后再浏览一些。
如果您在队列中放置了一条消息,并且没有任何内容可以接收它,则该消息将保持排队状态。如果您将消息放入主题并且没有活动订阅者或持久订阅,则会丢弃该消息。因此,队列中的消息自然是持久的,而主题上的消息可能是也可能不是。
从纯JMS角度来看,队列和主题都是目标实例,如果您不尝试浏览,则可以互换。应用程序可能无法知道它打开的目标是队列还是主题,除非它在运行时使用instanceOf()来查找。