查询有关java消息队列的信息

时间:2010-12-09 20:56:46

标签: jms

我有关于队列的设计查询。我的方案如下:

我必须使用消息系统,单个生产者和多个消费者(异步)。生产者将不同类型的消息推送到消息传递系统中。根据消息类型,特定消费者必须使用该消息。 (每个使用者在不同的服务器上运行)。如果一个消费者关闭并且该消费者收到消息,则它仅在消息传递系统中。如果我使用消息队列,队列中的消息将阻止其他消费者可以使用的下一条消息。队列是否适合处理这种情况?或者我们是否需要寻找主题?

1 个答案:

答案 0 :(得分:0)

是否使用队列或主题应取决于是否存在多个使用者必须处理相同消息的实例。如果是这种情况,则需要一个主题来生成一对多模式。

另一方面,如果任何一条消息只被一个消费者使用,那么您可以使用队列或主题,并且消费者将消息类型指定为JMS选择器。通过这种方式,所有消费者都可以监听同一队列,并且每个消费者都可以选择不同的消息子集。如果没有一个应用程序,它的消息不会“阻止其他消费者可以使用的下一个消息”,而是它们只是在队列中堆叠而其他消费者仍然根据选择标准接收消息。

请注意,队列是轻量级结构,每个用户可以轻松拥有一个队列。通常,提供服务的事物监听众所周知的队列,并且每个队列代表服务或不同服务的不同功能。因此,可能存在许多服务输入队列。类似地,回复消息通常唯一地寻址到发出请求的应用程序实例,并转到唯一的,通常是动态的回复队列。我所描述的这两种实现都导致跨队列分离流量,而不是将不同的消息类型集中到同一队列中。由于JMS选择器总是会产生额外的处理成本,因此使用更多队列通常比从同一队列中选择多种类型的消息更具性能。

我正在回答您在评论部分中关于选择器的问题,因为我有更多空间并且可以将链接放在...

JMS 1.1 spec州的第3.8.1节:

JMS消息选择器允许客户端通过消息头指定 它感兴趣的消息。只有标题和属性的消息 匹配选择器已交付。未交付的语义有所不同 取决于正在使用的MessageConsumer。见5.8节, 有关详细信息,请参阅“QueueReceiver”和第6.11节“TopicSubscriber”。

邮件选择器无法引用邮件正文值。

如果选择器的计算结果为true,则消息选择器会匹配消息 消息的标题字段和属性值将替换为它们 选择器中的相应标识符。

如上所述,选择器可以位于消息中隐含的字段上,例如MsgID或CorrelationID,或者thsey可以位于消息生成者专门设置的字段上,例如message属性。无论哪种方式,客户端都必须指定消息使用者使用的任何选择器的值。