0

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

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

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

4

4 回答 4

3

一般来说,这个概念是:

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

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

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

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

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

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

  1. Bus is the underlying infrastructure that can host "n" destinations. One ActivationSpec listens to one destination.
  2. With queue connection factory is a factory (J2EE factory pattern) for creating queues.
于 2009-07-09T08:31:48.343 回答
1

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

如果是这种情况,那么 MDB 应该听的是一个主题而不是一个队列

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

于 2009-06-23T10:41:10.623 回答
1

为什么需要消息总线?

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

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

这是一个如何使用 Spring 执行 JMS 的示例。这就是我建议继续进行的方式。

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

于 2009-06-23T10:42:43.270 回答
1

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

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

于 2009-06-23T13:07:27.877 回答