我想知道JMS队列和JMS主题之间有什么区别。
主题
在JMS中,主题实现发布和订阅语义。当您发布消息时,它会发送给所有订阅者 感兴趣的 - 所以零到多的订阅者都会收到一份 信息。只有当时有效订阅的订阅者 经纪人收到消息后会得到一条消息。
队列
JMS队列实现负载均衡器语义。一个消费者将收到一条消息。如果没有 消息发送时可用的消费者将保留 直到有消费者可以处理消息。如果一个 消费者在收到消息之前收到消息并且不会确认消息 然后该消息将被重新传递给另一个消费者。一个队列可以 让许多消费者在可用的消息中加载负载均衡 消费者。
我想要“东西”将以与ActiveMQ代理收到消息的顺序相同的顺序向每个订阅者发送消息副本。
有什么想法吗?
答案 0 :(得分:116)
这意味着一个主题是合适的。队列意味着消息转发给一个且只有一个可能的订户。一个主题发送给每个订阅者。
答案 1 :(得分:45)
主题是发布者 - 订阅者模型,而队列是点对点的。
答案 2 :(得分:20)
JMS主题是1对多分发模型中的目标类型。 所有消费订阅者都会收到相同的已发布消息。您也可以将其称为“广播”。模型。您可以将主题视为分布式计算Observer design pattern中主题的等效项。一些JMS提供程序有效地选择将其实现为UDP而不是TCP。对于主题,消息传递是“即发即忘”的。 - 如果没有人听,消息就会消失。如果这不是您想要的,您可以使用“持久订阅”。
JMS队列是消息的1对1目的地。消息仅由一个消费接收器接收(请注意:始终使用订阅者用于'主题客户端和接收器 for queue client's避免混淆)。发送到队列的消息存储在磁盘或内存中,直到有人拿起它或它过期。因此,队列(和持久订阅)需要一些主动存储管理,您需要考虑缓慢的消费者。
在大多数环境中,我认为,主题是更好的选择,因为您始终可以添加其他组件而无需更改架构。添加的组件可以是监控,日志记录,分析等。 在项目开始时你永远不会知道1年,5年,10年的要求是什么样的。改变是不可避免的,拥抱它:-)
答案 3 :(得分:8)
关于订单保存,请参阅this ActiveMQ page。简而言之:订单是为单个消费者保留的,但是对于多个消费者来说,订单不能得到保证。
答案 4 :(得分:4)
答案 5 :(得分:3)
如果您有N个消费者,那么:
JMS主题将消息传递给N中的N个 JMS队列将消息传递给N中的1个
你说你是"希望有一个''这将以与ActiveMQ代理接收消息的顺序相同的顺序向每个订阅者发送消息的副本。"
因此,您希望使用主题,以便所有N个订阅者都能获得该消息的副本。
答案 6 :(得分:1)
TOPIC :: topic是一对多通信...(多点或发布/订阅) EX:-imagine发布者在youtub中发布电影然后所有订阅者都会收到通知.... QUEVE :: queve是一对一的沟通...... 例如: - 当发布充值请求时,它将只有一个qreciever ... 永远记住,如果请求转到所有qreceivers然后多次充电发生,所以在开发适合应用程序的分析时
答案 7 :(得分:1)
队列
优点
缺点
主题
优点
缺点
答案 8 :(得分:-1)
Queue是JMS托管对象,用于保存等待订阅者使用的消息。当所有订阅者都使用该消息时,消息将从队列中删除。
主题是主题的所有订阅者在发布消息时都会收到相同的消息。