如何使用MDB从队列中按顺序读取消息?

时间:2010-11-30 07:26:03

标签: websphere ibm-mq synchronous message-driven-bean

我有一个侦听WebSphere MQ的MDB。它不会按队列接收的顺序获取消息。我如何让它按顺序读取?可能吗?我应该不使用MDB吗?

2 个答案:

答案 0 :(得分:5)

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

  1. 如果队列设置为优先级而不是FIFO传送,并且消息以不同的优先级到达,则它们将“无序”传送。
  2. 区分订单和订单。如果消息是在远程QMgr上生成的,并且有多条路径指向本地QMgr,则消息可能无序到达。
  3. 持久性的差异 - 如果消息是在远程QMgr上生成的并且具有不同的持久性,则非持久消息可能比持久消息更快到达,尤其是在设置了通道NPMSPEED(FAST)的情况下。
  4. 多个读取器/写入器 - 对序列的任何依赖性意味着单个生产者通过单个路径发送给单个使用者。生产者,消费者或它们之间的路径中的任何冗余都可能导致不按顺序传递消息。
  5. Syncpoint - 要保留序列,必须在同步点下写入和使用所有消息,否则必须在同步点之外写入和使用所有消息。
  6. 选择器 - 这些选择器专门用于根据队列中所有消息的上下文无序传递消息。
  7. 消息组 - 分组消息的检索通常会等到整个组出现。如果组是交错的,则消息将不按顺序传递。
  8. DLQ - 如果目标队列填满,则可以将消息传递到DLQ。当目标队列耗尽时,消息开始返回。如果队列接近容量,则消息可以在目标队列和DLQ之间交替。
  9. 因此,当MDB无序接收消息时,这些东西中的任何一个,或者甚至是其中的几个,都可能是原因。要么消除对消息序列的依赖(最佳选择),要么返回设计并协调可能导致无序处理的所有因素。

答案 1 :(得分:3)

要添加到T.Rob的列表,MDB使用应用程序服务器WorkManager来安排邮件传递,因此邮件顺序还取决于WorkManager启动工作项的顺序。这超出了WMQ的控制范围。如果将MDB ServerSessionPool深度限制为1,则会删除此限制,因为只有一个正在进行的Work实例,但代价是降低最大吞吐量。

如果您在WebSphere应用程序服务器中运行,那么使用ListenerPorts的非ASF模式可以保留消息顺序,但需要遵守一些事务/后退警告。这里有一个支持技术说明:

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