最近在线上部署的ActiveMQ发生一次故障,因为一台ActiveMQ故障将前台的关键应用全部连接挂住,根本原因有两条:session的timeout设置不合理以及session池没有限制大小。这里说的不是这个问题,而是在后续设置client的timeout过程中,有同学发现AMQ有一个严重的bug,timeout根本不起作用!!!
调试代码发现:
在Activemq的send response处理中,使用了一个BlockingQueue,在有timeout的方法里,使用了poll方法,这个方法的api说明中指出,当timeout发生时,这个方法返回null!!!
我们在看AMQ经过层层调用后,在ActiveMQConnection方法中如何处理这个返回值:
对返回值为空的情况没有做任何处理,即使消息发送超时,amq也认为这个消息发送成功!估计这哥们理解poll在timeout的时候会抛出异常吧。
解决办法很简单,在response为空的时候,抛出JMSException,告知发生Timeout错误。
posted on 2010-07-14 19:17
井底青蛙,常望天空 阅读(175)
评论(0) 编辑 收藏 所属分类:
ActiveMQ 、
java