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

Websphere 如何使用MDB从队列中按顺序读取消息?,websphere,ibm-mq,synchronous,message-driven-bean,Websphere,Ibm Mq,Synchronous,Message Driven Bean,我有一个MDB,它监听WebSphereMQ。它不会按照队列接收的顺序拾取消息。我怎样才能让它按那个顺序读呢?可能吗?我不应该使用MDB 通常,WMQ按照接收的顺序发送消息。然而,有几件事会影响到 如果队列设置为优先级而不是FIFO传递,并且消息以不同的优先级到达,则它们将“无序”传递 区分生产订单和交付订单。如果消息是在远程QMgr上生成的,并且存在到本地QMgr的多条路径,则消息可能会无序到达 持久性差异-如果消息是在远程QMgr上生成的,并且具有不同的持久性,则非持久性消息可能比持久性消息

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

通常,WMQ按照接收的顺序发送消息。然而,有几件事会影响到

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

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

    要添加到T.Rob的列表中,MDB使用application server WorkManager计划消息传递,因此,消息顺序也取决于WorkManager启动工作项的顺序。这不在WMQ的控制范围之内。如果将MDB ServerSessionPool深度限制为1,则此限制将被删除,因为只有一个在用工作实例,但代价是降低最大吞吐量

    如果您在WebSphereApplicationServer中运行,那么带有ListenerPorts的非ASF模式可以根据一些事务/回退警告保留消息顺序。这里有一个技术支持说明: