2017-04-19 94 views
0

你好我對ActiveMQ的5.10.0工作他們是窗簾的過程,將通過TCP連接進行連接和發送消息到一個隊列,也話題訂閱,總計最大連接數是10000左右ActiveMQ的失效連接的問題

經過一番使用面臨的錯誤,因爲在activeMQ超過最大連接,我已經通過activemq控制檯,發現很多TCP連接仍處於活動狀態爲真,並且此連接堆積到10000和ActiveMQ拋出錯誤超過最大連接。

爲什麼這個連接永遠處於真正的狀態如何擺脫這種連接有沒有什麼辦法來殺死這個死連接或使連接在一段時間後過期。

謝謝你..!

回答

1

每當一個JMS客戶端希望與一個MQ代理,然後典型代碼連接是這樣的:

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
connection = connectionFactory.createConnection(); 

現在,一旦JMS客戶端(生產者/消費者),如果它不關閉連接完成那麼JMS客戶端仍將保持與MQ代理的連接,並將與MQ代理建立連接。現在,在你的情況下,看起來你的JMS客戶端代碼「可能有問題」並且沒有關閉連接,所以你需要檢查你的JMS客戶端代碼並像下面那樣關閉連接。現在

if (connection != null) { 
     connection.close(); 
} 

,話說回來,如果你有消息監聽器的JMS客戶端,然後預計連接將保持開放,但在情況下,如果這些連接是完全不活動的一段時間後,你可以指定最大閒置持續時間使用wireFormat.maxInactivityDuration,這個時候要創建一個使用MQ代理的連接,那麼你應該創建一個這樣cf = new ActiveMQConnectionFactory( "tcp://localhost:61616?wireFormat=openwire&wireFormat.maxInactivityDuration=<<whatever_value_you_want>>");

this ActiveMQ的更多細節文件的連接。


作爲FYI - 在一個ActiveMQ代理連接的最大數目是使用其配置文件activemq.xml定義內,你有,你定義的最大連接(?maximumConnections=1000),如下所示transportConnectors元件,所以只是在如果你有適當的系統資源,並且你有能力獲得更多的客戶端連接,那麼你可以增加。

<transportConnectors> 
      <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> 
      <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
      <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
</transportConnectors> 
+0

嗨@hagrawal感謝您的重播,因爲你說我檢查了我的代碼所有連接都越來越關閉connection.close(); ,案例1:事實上,當用戶在網絡上登錄時,通過tcp連接訂閱了一個主題,它沒有像用戶註銷或會話過期時那樣關閉。 – user4045063

+0

案例2:在隊列中放置消息時,最終用戶的互聯網連接受到干擾,並且MQ無法向請求使用發送確認,以便連接保持。在一段時間關閉連接之後,可以在activemq.xml中進行任何更改。 – user4045063

+0

對於你的情況1:正如你所提到的,清楚的問題是,當用戶註銷或如果會話過期,那麼你必須關閉連接。對於情況2:就像我說過的,你可以指定最大無活動時間,也可以用類似的方式超時參數,請閱讀這裏 - http://activemq.apache.org/tcp-transport-reference.html。看看你的情況,我認爲你應該配置緩慢的消費者,請閱讀 - https://planet.jboss.org/post/coming_in_activemq_5_9_a_new_way_to_abort_slow_consumers – hagrawal