是使用队列还是主题应取决于是否存在多个使用者必须处理相同消息的实例。如果是这种情况,那么需要一个主题来生成一对多模式。
另一方面,如果任何一条消息只被一个消费者使用,那么您可以使用队列或主题,并且消费者将消息类型指定为JMS选择器。通过这种方式,所有消费者都可以监听同一队列,并且每个消费者都可以选择不同的消息子集。如果没有一个应用程序,它的消息不会“阻止其他消费者可以使用的下一个消息”,而是它们只是在队列中堆叠而其他消费者仍然根据选择标准接收消息。
还要意识到队列是轻量级结构,每个用户可以轻松拥有一个队列。通常,提供服务的事物在众所周知的队列上进行侦听,并且每个队列代表服务或不同服务的不同功能。因此,可能存在许多服务输入队列。类似地,回复消息通常唯一地寻址到发出请求的应用程序实例,并转到唯一的,通常是动态的回复队列。我所描述的这两个实现都导致跨队列分离流量,而不是将不同的消息类型汇集到同一队列中。由于JMS选择器总是会产生额外的处理成本,因此使用更多队列通常比从同一队列中选择多种类型的消息更具性能。
我在这里评论部分回答你关于选择器的问题,因为我有更多的空间,可以把链接放在......
JMS 1.1 spec的第3.8.1节规定:
A JMS message selector allows a client to specify, by message header, the
messages it’s interested in. Only messages whose headers and properties
match the selector are delivered. The semantics of not delivered differ a bit
depending on the MessageConsumer being used. See Section 5.8,
“QueueReceiver,” and Section 6.11, “TopicSubscriber,” for more details.
Message selectors cannot reference message body values.
A message selector matches a message if the selector evaluates to true when
the message’s header field and property values are substituted for their
corresponding identifiers in the selector.
如上所述,选择器可以在消息中隐含的字段上,例如MsgID或CorrelationID,或者thsey可以在消息生成器专门设置的字段上,例如消息属性。无论哪种方式,客户端都必须指定消息使用者使用的任何选择器的值。