2010-12-09 100 views
1

我有一个关于队列的设计查询。我的情况如下:有关java消息队列的查询

我必须使用消息传递系统,单生产者和多消费者(异步)。生产者将不同类型的消息推入消息传递系统。根据消息类型的不同,该消费者必须使用该消息。 (每个使用者在不同的服务器上运行)。如果一个消费者宕机并且该消费者发出消息,则消息将只在消息传递系统中。如果我使用消息队列,则队列中的消息将阻止其他消费者可以使用的下一条消息。队列是否适合处理这种情况?或者我们需要去讨论一个话题?

回答

0

您是否使用队列或主题应取决于是否存在多个使用者必须处理相同消息的实例。如果是这种情况,那么需要一个主题来生成一对多模式。另一方面,如果任何一条消息只会被一个消费者使用,那么您可以使用队列或主题,消费者将消息类型指定为JMS选择器。通过这种方式,所有消费者都可以在同一个队列上进行监听,并且每个消费者都选择不同的消息子集。如果一个应用程序不存在,那么消息不会“阻止其他消费者可以使用的下一个消息”,而是它们只会堆积在队列中,而其他消费者仍然会根据选择标准接收他们的消息。

请注意,队列是轻量级构造,您可以轻松地为每个消费者创建一个队列。通常,提供服务的东西在众所周知的队列上监听,而每个队列代表服务或不同服务的不同功能。因此可能有很多服务输入队列。类似地,回复消息通常唯一地发送给发出请求的应用程序实例,并转到唯一的,通常是动态的回复队列。我所描述的这两种实现都会导致跨队列的流量分离,而不是将不同的消息类型合并到同一个队列中。由于JMS选择器总是会带来额外的处理成本,因此使用更多的队列通常比从同一队列中选择多种类型的消息更有效。

我回答你的问题有关的评论部分选择在这里,因为我有更多的空间,可以把链接在...

JMS 1.1 spec状态的3.8.1:

一个JMS消息选择器允许客户端通过消息头指定它感兴趣的消息。仅传送其头和属性为 的消息。根据正在使用的MessageConsumer,未送达的语义差异 。有关更多详细信息,请参见第5.8节, “QueueReceiver”和第6.11节“TopicSubscriber”。

消息选择器无法引用消息正文值。

当选择器的值为 时,消息的标题字段和属性值被替换为其在选择器中的对应标识符,消息选择器将匹配消息。

如上所述,选择器可以在消息中隐含的字段上,例如MsgID或CorrelationID,或者可以在由消息生产者特别设置的字段(例如消息属性)上。无论哪种方式,客户端都必须指定消息使用者使用的任何选择器的值。

+0

谢谢Rob。有什么方法(API)在消息使用者上设置消息选择器。或者我们是否需要将选择器设置为生产者消息的一部分。 – Madhavi 2010-12-10 17:15:44