有没有办法批量使用来自WebSphere MQ队列的消息? e.g。
messages = queue.receiveBatch( BATCH_SIZE )
在单一“接收”中,它会将一组消息(例如列表[消息])返回到BATCH_SIZE
。
(我可以在交易中调用接收BATCH_SIZE
次,但这不是我要找的)
如果message groups可以解决它,它会是什么样子?虽然它似乎不是正确的解决方案,因为“消息组”似乎是逐个阅读消息。
答案 0 :(得分:3)
没有。 WMQ具有预读,其中非持久性消息被流式传输到客户端,但即使在那里,客户端也会为每条消息执行单个GET
(或等效语言)。
异步消息传递的一个属性应该是消息是原子的。消息对其他消息的任何依赖性称为亲缘关系,消息亲和性打破异步模型。 (但是每个传输都会为亲和力做出一些调整,而消息分组就是一个例子。)因此,GET
是与消息具有1:1对应关系的原子工作单元。
WMQ消息可以是任意大小,最大为100MB,并且可以对大于此的消息进行分段,其中一条逻辑消息被分割为多条物理消息。在分段消息的情况下,一个GET
将导致消耗多个消息,但是对于应用程序,仅返回一个逻辑消息。
WMQ频道使用批次,直到最近这些都是严格按消息计数构建的。然而,如果大小消息都经过相同的信道,则上述消息大小的可变性使得调谐信道非常困难。在WMQ的v7.1中,通道批处理现在受到消息计数或字节计数的限制,以先到者为准。消息GET
批处理的任何概念都需要类似的调整功能,以防止对内存造成严重影响。还有与日志记录,队列大小等相关的其他交互。另请注意,如果一条消息失败,则必须回滚整个批处理。
如果目的是提高性能,请使用事务。在同步点下接收消息时,您可以在GET
次呼叫之间将消息数量调整为COMMIT
。您可以使用COMMIT
间隔>大幅提升效果但是,这会超过阈值,您可以通过一些试验和错误来确定。性能报告可帮助确定适合您平台的最佳数量。这些可以从SupportPacs main page获得。查找名称为MPxx的条目。
如果消息是非持久性的,并且您可以在断开连接时丢失其中一些消息,那么您可以使用预读 - 假设您有一个现代版本的WMQ。这将消息传递到应用程序的WMQ客户端,以便在调用GET
时下一条消息已经在本地缓冲区中。
顺便说一句,原帖中的链接是WMB文档。可以找到WMQ文档here。