昨天发现系统的一些业务异常,查日志发现是出现了死锁,且在那段时间导致自动支付的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控制台中可看到:

AMQ DLQ

p.s.2 在SOF上补充了一个相关问题:http://stackoverflow.com/a/20374297/365041,配置大致如下: