最近在線上部署的ActiveMQ發(fā)生一次故障,因為一臺ActiveMQ故障將前臺的關(guān)鍵應用全部連接掛住,根本原因有兩條:session的timeout設置不合理以及session池沒有限制大小。這里說的不是這個問題,而是在后續(xù)設置client的timeout過程中,有同學發(fā)現(xiàn)AMQ有一個嚴重的bug,timeout根本不起作用!!!
調(diào)試代碼發(fā)現(xiàn):
在Activemq的send response處理中,使用了一個BlockingQueue,在有timeout的方法里,使用了poll方法,這個方法的api說明中指出,當timeout發(fā)生時,這個方法返回null!!!
我們在看AMQ經(jīng)過層層調(diào)用后,在ActiveMQConnection方法中如何處理這個返回值:
對返回值為空的情況沒有做任何處理,即使消息發(fā)送超時,amq也認為這個消息發(fā)送成功!估計這哥們理解poll在timeout的時候會拋出異常吧。
解決辦法很簡單,在response為空的時候,拋出JMSException,告知發(fā)生Timeout錯誤。