
背景:
一個同事往這個隊列發數據,另一個同事從這個隊列取數據,進行解析。
這是昨天同事昨天消費者 消費activemq 隊列,一開始有正常,運行了一段時間后,發現突然消費者變為零了。因為有監控。之后怎么也連不上。然后報了這個錯。
javax.jms.JMSException: Cannot send, channel has already failed: tcp://IP:61616
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:62)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1409)
at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1496)
at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:524)
分析:
本以為是同事寫的程序有問題,就用本地寫了一個最簡單的取數據程序,依舊是報這個錯。
為了不讓隊列監控一直報警,就讓發送數據的同事A 停止 生產者程序。
突然之后就可以正常取程序了。
問題鎖定:
這才懷疑是生產者出現的問題。是因為他每次發送消息都new 一個連接。導致超出默認最大連接數1000 。所以無法再有連接隊列,導致隊列無法連接
發生這個錯誤,去檢查下自己代碼,是否是每次都創建一個連接,而沒有關閉連接。
一般分為兩種連接
一種是長連接,適用於處於一值發送數據,
一種短連接,就是連接了,發送完數據,就關閉連接
</div>
