【问题标题】:How exactly works JMS queue (point to point message)?JMS 队列(点对点消息)究竟是如何工作的?
【发布时间】:2015-03-05 19:44:10
【问题描述】:

我正在学习 Spring Core 认证,我对 JMS 的工作原理以及 Spring 如何处理它有一些疑问。

所以我知道 JMS 核心组件是:

  1. 留言
  2. 目的地
  3. 连接
  4. 会话
  5. 消息生产者
  6. 消息消费者

据我了解,Message 是发送并与其他实体(必须使用此数据的其他产品)共享的内容,并且消息可以具有不同的形状:TextMessageObjectMessageMapMessageBytesMessageStreamMessage

好的,据我了解,JMS 核心组件的 Destination 组件定义了谁接收消息以及发送消息的逻辑。

所以我知道我有两种目的地:

  1. 队列:定义点对点消息。据我了解,我可以有一些 Message Producer 将生成的消息放入队列,然后我有一些 MessageConsumer 消耗消息。每条消息都可以被一个MessageConsumer消费。

    现在我的疑问是:MessageConsumer 消费由特定 MessageProducer 放入队列的消息(MessageConsumer 和 MessageProducer) 或 MessageProducer 放置一个与特定 MessageConsumer 相关的 id,该特定 MessageConsumer 必须读取它放入队列中的消息?

例如,在第一种情况下,如果我有 2 个 MessageProducer 分别命名为 Producer-1Producer-2 我需要2 个名为 Consumer-1Consumer-2MessageConsumer,其中 Consumer-1 使用从 Producer 生成的消息-1Consumer-2 使用 **Producer-2) 生成的消息。

在第二种情况下,Consumer-1 可以消费由 Producer-1Produer-2 生成的消息,因为 strong>MessageProducer 将消息放入队列中,指定谁是必须使用该消息的 MessageConsumer

具体是如何工作的?正确的逻辑是什么?

【问题讨论】:

    标签: java spring jakarta-ee jms spring-jms


    【解决方案1】:

    如果我有 2 个 MessageProducer,分别命名为 Producer-1 和 Producer-2 我需要有 2 个 MessageConsumer 名为 Consumer-1 和 Consumer-2,其中 Consumer-1 使用 Producer-1 生成的消息 和 Consumer-2 消费从 **Producer-2) 产生的消息。

    不是真的。消息消费者连接到队列,它将接收放入队列中的所有消息,而与生产者无关。因此,如果您有两个生产者分别将一条消息放入队列中,则该消息将被连接到它的单个消费者消费。

    如果您希望由不同的生产者生成的消息针对特定的消费者,您应该使用称为“消息选择器”的概念。为了实现这一点,消息生产者应该向消息(系统头或自定义头)添加“头”,然后消息侦听器可以指定他们接收与特定头匹配的消息。

    【讨论】:

    • 好的,那么您是在对我说,该消息包含诸如 ID 之类的东西,用于指定消费者必须阅读的内容?或者是什么?如果我有 2 个将消息放入队列的生产者和将 2 个消费者放入同一队列的会发生什么?
    • 没有。我的意思是,如果您需要让生产者 1 将其消息传递给消费者 1,则生产者 1 必须 ** 向消息显式添加一个 id ** 并且消费者必须指定它只侦听包含此类的消息一个 id(id 是消息头)。默认情况下,该消息将不包含任何 ID。如果您没有添加任何可以用作消息选择器的标头 ** 并且 ** 有 2 个消费者连接到它,则无法保证谁收到什么。唯一可以保证的是消息将准确地传递给 1 个消费者。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 2014-12-16
    • 2014-09-19
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    相关资源
    最近更新 更多