JMS主题与队列 - 意图

时间:2013-07-02 15:17:35

标签: java jms message-queue publish-subscribe jms-topic

我试图了解使用Queue的用例。

我的理解: 队列意味着一对一。唯一的用例(如果不罕见,很少)将是:消息仅用于一次消费。

但即使在这些情况下,我也可能想要使用Topic(只是为了将来安全)。唯一需要特别注意的是使订阅持久。或者,在特殊情况下,我会使用桥接/调度机制。

如上所述,我总是(或者在大多数情况下)想要发布主题。订阅者可以是持久主题或分派队列。

请让我知道我在这里缺少什么,或者我错过了原来的意图?

3 个答案:

答案 0 :(得分:3)

如果您根据实际示例考虑,何时使用队列的设计要求很简单:

  • 提交在线订单(完全一次处理以避免收取信用额度 卡两次)
  • 私人点对点聊天(每封邮件只有一个接收者)
  • 并行任务分配(在网络系统中的许多工作人员之间分配任务)

...以及何时使用主题的示例......

  • 向多个订阅者广播的新闻;通知服务,股票代码等。
  • 电子邮件客户端(独特的持久订阅者;当您断开连接时仍会收到电子邮件)

你说......

  

但即使在这些情况下,我也可能想要使用Topic(仅仅是为了未来   安全)。我唯一需要做的额外情况是制作(每个)   订阅持久。或者,我特殊情况,我会使用桥接/   调度员机制。

你过度设计了这个设计。确实,您可以使用主题和持久订阅者实现一次性处理,但您只能使用单个持久订阅者;当您为该主题启动另一个订阅者时,您将获得对同一消息的重复处理,更不用说,单个持久订阅者几乎不是可扩展的解决方案;它肯定会成为你系统的瓶颈。使用队列,您可以在同一队列的100个节点上部署1000个接收器,并且您仍然可以对单个消息进行一次性处理。

你说......

  

上面提到,我总是(或者在大多数情况下)想要发布到   话题。订阅者可以是持久主题,也可以是已发送的主题   队列(或多个)。

将调度队列与主题订阅者一起使用有点多余。在使用队列时,你基本上可以进行异步调度,那么为什么不使用队列?...没有理由在它前面放置一个主题。

答案 1 :(得分:0)

您可能错过了两个队列和主题都可以拥有多个订阅者。队列会将消息传递给潜在的许多订户之一,而主题会将消息传递给所有订阅者。

如果您确实只有一个订阅者,那么队列订阅者和持久主题订阅者的行为将类似。我宁愿把这种情况视为“特殊情况”。

答案 2 :(得分:0)

JMS中的队列和主题代表两种不同的模型 - 点对点和发布/订阅。主题将保留消息,直到所有客户端都收到它们,所有订阅者都处理它们。队列将等待第一个消费者提取消息,并考虑在那时读取消息。