【问题标题】:Message Driven Beans - Single Bus, Multiple Activation Specs消息驱动 Bean - 单总线,多激活规范
【发布时间】:2010-11-05 03:03:41
【问题描述】:

我有 2 个消息驱动的 bean。这些 bean 的 2 个激活规范。我有一个消息总线,并且两个激活规范都配置为这一个总线。我为该消息总线配置了 2 个不同的队列和一个队列连接工厂。

现在,我将编写代码,在确定队列后在运行时向其中一个队列发送消息。但是,我的两个 MDB 都收到相同的消息。 这种配置一般是如何完成的?我是否总是配置 1 个队列 -> 1 个队列连接工厂 -> 1 个消息总线 -> 1 个 MDB?都是一对一的关系吗?

哦,我忘了提这个:我使用的是 Websphere Application Server v6.1

【问题讨论】:

    标签: java jakarta-ee message-queue message-driven-bean


    【解决方案1】:

    一般来说,这个概念是:

    1. 一条消息被发送(队列)/发布(主题)到目的地(队列/主题)
    2. ActivationSpec 侦听特定目的地(队列/主题)的消息
    3. ActivationSpec:目标是 1:1 关系
    4. 一个 bean(作为消费者的 MDB)被配置为监听 ActivationSpec。

    这意味着实际上 bean 通过由activationSpec 提供的间接层链接到目的地。

    总线从何而来 - SIBus 是使这一切成为可能的消息传递基础设施。目的地位于巴士上。

    回到这个问题 - ActivationSpec 将被配置为监听总线上的目的地,消息将发送到该目的地。连接工厂决定将消息发送到的总线。只要目标名称是唯一的并且针对特定队列(JMS 队列链接到总线上的目标),一条消息就只能由一个 ActivationSpec 接收。

    总线上创建了多少个目的地(在 WAS 管理控制台中的 SIBus 链接下)?您能否检查/验证配置是否正确?

    回答您的问题 - “每个激活规范是否有一个总线,每个队列有一个队列连接工厂。” - 答案是否定的。

    1. 总线是可以承载“n”个目的地的底层基础设施。一个 ActivationSpec 监听一个目的地。
    2. 带有队列连接的工厂是用于创建队列的工厂(J2EE 工厂模式)。

    【讨论】:

      【解决方案2】:

      我怀疑您的配置没有按照您的想法进行设置。我们使用您描述的相同配置,具有许多 MDB(带有队列和激活规范)、单个工厂和消息总线,一切都按预期工作。

      要获得您所看到的行为实际上是不可能的,除非您将相同的消息发送到两个队列,或者定义了一个主题而不是一个队列。我很确定即使两个 MDB 都从同一个队列中读取,也只有一个会收到消息,因为队列只支持点对点消息传递。您所描述的是基于主题的行为。

      【讨论】:

      • @Robin 我想这与两个 MDB 使用同一总线的激活规范有关。
      • @Jay - 不。配置的那部分很好。单总线多队列没有错。我们有这种情况,而且效果很好。它只是 IBM 配置,不会改变预期的 JMS 行为。
      【解决方案3】:

      为什么需要消息总线?

      通常我将 MDB 与队列相关联 - 这是 1:1 的关系。向队列发送消息,侦听器得到它。公共汽车给你买什么?

      我已经使用 WebLogic 完成了 JMS,并且不需要消息总线这样的结构。我认为这是IBM的事情。

      Here's 一个如何用 Spring 做 JMS 的例子。这就是我建议继续进行的方式。

      更新:我误解了你的问题。当您说您的两个队列都收到相同的消息时,我认为这不是所需的行为。如果是,那么主题是正确的方法。队列是点对点的消息传递;主题是发布/订阅。

      【讨论】:

      • @duffymo 确实,这是 IBM 的事情。而且,不,我并不是说接收相同消息的两个队列是期望的行为。我们正在谈论两个不同的队列和不同的消息。问题是:总是 - 每个激活规范一个总线和每个队列一个队列连接工厂。如果我要将消息发送到单个队列并使用 MDB 提取它,这是否都是 1-1-1 关系?
      • 是的,这就是队列中体现的点对点模型的含义。正如尼克霍尔特所说,如果您希望多个订阅者访问同一条消息,您应该使用主题而不是队列。
      【解决方案4】:

      我认为您的意思是希望两个 MDB 接收相同的消息,对吗?

      如果是这种情况,那么 MDB 应该监听的是 topic 而不是 queue

      或者,您可以通过多种方式配置 IBM MQ 来转发消息,例如,发布到特定 queue 的消息可以重新发布到 n 其他 queues,但我只看到在重新发布之前进行某种消息丰富时使用它,所以我怀疑这对于你想要实现的目标来说太过分了。

      【讨论】:

        猜你喜欢
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 2010-12-25
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        相关资源
        最近更新 更多