我有一个从IBM MQ读取消息的系统。从这个队列中我们有时会得到损坏的数据。如果消息在下次读取时失败,则监听器将等待5分钟后再继续。当消息失败3次时,它将被置于退避队列中。 JMSContainerFacotry设置为并行运行最大值10。这意味着如果我们收到大量损坏的消息,这些消息每个消息需要10分钟才能到达Backoff-queue(这没关系),但是它们最终消耗了所有线程,因此其他消息必须等待所有损坏才能到达处理前的退避队列。我想从侦听器中删除wait(),这样就不会阻塞线程,但是失败的消息仍会等待5分钟再重新弹出。
我知道使用ActiveMQ,您可以告诉队列等待5分钟再次弹出相同的消息,使用IBM MQ我没有这种可能性。是否可以将失败的消息放入队列后面?现在失败的消息似乎在新的消息面前弹出。或者将失败消息的jmspriority设置得更低。那么,如果有失败的消息将在失败之前从队列中弹出?
我的倾听者是这样的:
@JMSListener()
public void listen(Object message) {
TextMessage textMessage = (TextMessage) message;
if (textMessage.getIntProperty("JMSXDeliveryCount") > 1) {
//pause for 5 minutes
}
//buisness logic
}
队列中是IBM MQ。 AS是Jboss 6.
答案 0 :(得分:0)
如果你收到毒药信息,不知道为什么你会暂停5分钟。如果你知道它不好,你为什么不把它扔掉或者把它传递到退出队列进行进一步调查?请参阅JMS中毒消息处理:
http://www.ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q032280_.htm
更多的是,你为什么会这么多'坏'消息?
答案 1 :(得分:0)
我知道使用ActiveMQ你可以告诉队列等待5分钟 在再次弹出相同的消息之前,使用IBM MQ我没有 可能性。
需要在MDB侦听器端设置尝试之间的重试间隔选项,因为它充当客户端。但不是在WMQ方面。
是否可以将失败的消息放回队列后面?
您想将消息放回队列中还是将有毒消息放在同一队列的末尾? 我们无法将有害消息移至同一个队列的末尾
处理有毒消息的选项只有三个: