昨天发现系统的一些业务异常,查日志发现是出现了死锁,且在那段时间导致自动支付的jms listener中也抛了锁超时异常。今天尝试解决此问题,第一个想到的是将目前我们使用的acknowlege mode从auto改为manual,然后在代码中手动触发acknowlege,但是此方法代码修改量较大。经过一番google,在AMQ中找到了这么一个特殊的队列:DLQ(http://activemq.apache.org/redelivery-policy.html),默认1秒间隔,重发6次。经过尝试,只要将acknowledge mode改为“transacted”即可,简单科学,另外重发间隔、次数均可在spring中进行配置,代码稍后提交
另外值得注意的是,并不是所有的消息队列都需要重发,而应该根据具体的业务需求。比如我们的短信发送已自己通过数据库实现了重发,在jms中就不该再使用。当然,如果之前就知道DLQ那我们完全不必自己实现,此为一处败笔,有时间会使用DLQ对短信发送机制进行简化
p.s. DLQ配置后在AMQ控制台中可看到:
p.s.2 在SOF上补充了一个相关问题:http://stackoverflow.com/a/20374297/365041,配置大致如下:
<amq:connectionfactory brokerURL="..." id="connectionFactory"> <amq:redeliverypolicymap> </amq:redeliverypolicymap><amq:redeliverypolicymap><!-- Don't know why a double nesting --> <amq:defaultentry> <!-- default policy, 5 times with 10s delay each --> <amq:redeliverypolicy maximumRedeliveries="5" initialRedeliveryDelay="10000"></amq:redeliverypolicy> </amq:defaultentry> <amq:redeliverypolicyentries> <!-- three times with exponential back-off, that is, 1s, 2s, 4s, 8s. "queue" references to the "physicalName" defined in amq:queue --> <amq:redeliverypolicy queue="queue.thread.autopay" maximumRedeliveries="3" initialRedeliveryDelay="1000" backOffMultiplier="2" useExponentialBackOff="true"></amq:redeliverypolicy> <!-- another policy mapping --> <amq:redeliverypolicy queue="queue.thread.doc" maximumRedeliveries="2" initialRedeliveryDelay="4000"></amq:redeliverypolicy> </amq:redeliverypolicyentries> </amq:redeliverypolicymap> </amq:connectionfactory>
-- EOF --
除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:有关AMQ的DLQ
发表回复