2

队列中有哪些功能无法通过主题实现?

4

1 回答 1

1

我遇到的主要要求是消费者不能竞争某个主题的单个消息。例如,我有一个发布呼叫中心事件的客户。多个系统订阅这些事件。其中一个系统是实际的呼叫路由应用程序,它运行着多个实例。如果每个实例都订阅,则呼叫将路由到所有实例。但是,如果消息被放到一个队列中并且所有实例都消耗同一个队列,那么只有一个实例会接收到消息,并且调用会转到该操作员。如果发布应用程序从主题转换为队列,呼叫中心会正常工作,但所有其他订阅者应用程序都不会收到消息。

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

此外,您不能在主题上使用浏览语义,而可以在队列上使用。使用主题,您可以指定选择器来过滤返回的消息,仅此而已。使用队列,您可以浏览、重置浏览指针,然后浏览更多内容。

如果您将一条消息放在队列中,但没有任何东西可以接收它,则该消息仍处于排队状态。如果您将消息放入主题并且没有活动订阅者或持久订阅,则该消息将被丢弃。因此,队列中的消息自然是持久的,而主题上的消息可能是也可能不是。

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

于 2010-08-11T17:27:34.763 回答