2010-08-11 73 views

回答

1

我碰到的主要要求是消费者无法在主题上竞争单一消息。例如,我有一位发布呼叫中心活动的客户。几个系统订阅这些事件。其中一个系统是具有多个实例运行的实际呼叫路由应用程序。如果每个实例订阅,则该呼叫被路由到所有这些实例。但是,如果将消息放入队列并且所有实例消耗掉相同的队列,则只有一个消息会接收消息,并且调用将转至该运算符。如果发布应用程序从主题转换为队列,则呼叫中心可以正常工作,但所有其他订阅者应用程序都不会收到该消息。

该解决方案(在WebSphere MQ中实现)是为该主题创建管理订阅并将消息传递到所有应用程序实例使用的队列。所以生产者应用仍然是发布者,所有动态订阅者仍然获得消息的副本,呼叫中心应用实例竞争每个发布消息的单个实例。

此外,您不能在主题上使用浏览语义,而您可以在队列中使用浏览语义。通过主题,您可以指定选择器来过滤返回的消息,但这只是关于它。使用队列可以浏览,重置浏览指针,然后浏览更多。

如果您将消息放在队列中,但没有消息接收消息,则消息将保持排队。如果您向某个主题发送消息,并且没有活动的订阅者或持久订阅,则该消息将被丢弃。因此,队列中的消息自然是持久的,而主题上的消息可能会或可能不会。

从纯粹的JMS角度来看,队列和主题都是目的地的实例,如果您不尝试浏览,它们可以互换。应用程序可能不知道它打开的目标是一个队列还是一个主题,除非它在运行时使用instanceOf()来查找。