5

我有一个监听 WebSphere MQ 的 MDB。它不会按照队列接收到的顺序接收消息。我怎样才能让它按那个顺序阅读?可能吗?我不应该使用 MDB。

4

2 回答 2

5

通常,WMQ 会按照收到消息的顺序传递消息。但是,有几件事可能会影响...

  1. 如果队列设置为优先级而不是 FIFO 传递,并且消息以不同的优先级到达,则它们将“乱序”传递。
  2. 区分生产的订单和交付的订单。如果消息是在远程 QMgr 上生成的,并且有多个到本地 QMgr 的路径,则消息可能会乱序到达。
  3. 持久性的差异 - 如果消息在远程 QMgr 上生成并且具有不同的持久性,则非持久性消息可能比持久性消息更快地到达,尤其是在设置了通道 NPMSPEED(FAST) 的情况下。
  4. 多个读取器/写入器 - 对序列的任何依赖都意味着单个生产者通过单个路径发送给单个消费者。生产者、消费者或它们之间的路径中的任何冗余都可能导致消息传递失序。
  5. 同步点 - 为了保持顺序,所有消息必须在同步点下写入和使用,否则所有消息都必须在同步点之外写入和使用。
  6. 选择器 - 这些专门用于根据队列中所有消息的上下文乱序传递消息。
  7. 消息组 - 分组消息的检索通常要等到整个组都存在。如果组是交错的,则消息会乱序传递。
  8. DLQ - 如果目标队列已满,则可以将消息传递到 DLQ。随着目标队列被耗尽,消息开始返回那里。当队列接近容量时,消息可以在目标队列和 DLQ 之间交替。

因此,当 MDB 接收无序消息时,这些事情中的任何一个,甚至其中几个组合在一起,都可能是原因。要么消除对消息序列的依赖(最佳选择),要么返回设计并协调所有可能导致失序处理的因素。

于 2010-12-11T21:43:10.970 回答
3

为了添加到 T.Rob 的列表中,MDB 使用应用程序服务器 WorkManager 来安排消息传递,因此消息顺序还取决于 WorkManager 启动工作项的顺序。这不在 WMQ 的控制范围内。如果您将 MDB ServerSessionPool 深度限制为 1,则此限制将被移除,因为将永远只有一个运行中的 Work 实例,但以降低最大吞吐量为代价。

如果您在 WebSphere 应用程序服务器中运行,那么具有 ListenerPorts 的非 ASF 模式可以保留消息顺序,但会受到一些事务/回退警告的影响。这里有一个支持技术说明:

http://www-01.ibm.com/support/docview.wss?uid=swg21446463

于 2011-07-19T08:50:01.307 回答