最近在線上部署的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錯誤。