[英]how to limit number of connections to IBM MQ
我有一個 Spring 基於引導的消息傳遞應用程序向 IBM MQ 隊列管理器發送/接收 JMS 消息。 基本上,它使用MQConnectionFactory
來組織與 IBM MQ 的連接,並使用來自JmsPoolConnectionFactory
messaginghub:pooledjms
的 JmsPoolConnectionFactory 來啟用 JMS 連接池,該連接池已從 IBM MQ 7.x 中的 MQConnectionFactory 中刪除
該應用程序使用兩種不同的方法來處理 JMS。 “正確”的人運行JMSListener
來接收消息,然后使用JmsTemplate.send()
對每條消息發送響應。 還有第二種“麻煩”的方法,應用程序使用 JmsTemplate.send() 發送請求並使用JmsTemplate.readByCorrelId()
JmsTemplate.send()
等待響應,直到收到或超時。
我說這很麻煩,因為如果響應延遲,這會使 JMS 會話持續更長時間,並且很容易耗盡 IBM MQ 連接限制。 不幸的是,我目前無法將應用程序重寫為解決問題的第一種方法。
現在我想限制池中的連接數。 當然,延遲的請求會失敗,但 IBM MQ 連接限制目前更重要,所以這有點合適。 問題是,即使我禁用了 JmsPoolConnectionFactory, MQConnectionFactory
似乎仍然打開到查詢管理器的多個連接。
在分析應用程序時,我看到由JMSCCMasterThreadPool
創建的多個線程RvcThread: com.ibm.mq.jmmqi.remote.impl.RemoteTCPConnection@12433875[...]
以及與 MQ Explorer 中查詢管理器的相應連接。 我想知道為什么盡管從 MQConnectionFactory 中刪除了連接池,但其中還有很多? 我想它應該打開並重用一個連接,但在我的測試中它不是真的。
禁用“麻煩” JmsTemplate.readByCorrelId()
並在應用程序中僅保留“正確”方式會刪除這些多個連接(當然還有等待線程)。 用SingleConnectionFactory
替換JmsPoolConnectionFactory
對這個問題沒有影響。
有沒有辦法限制這些連接? 是否可以控制JMSCCMasterThreadPool
中的最大線程作為解決方法?
因為它會影響其他應用程序,您的 MQ 管理員可能希望您不要耗盡整個隊列管理器的連接限制( qm.ini
中的MaxChannels
和MaxActiveChannels
參數)。 他們可以通過定義您的應用程序專用的 MQ 通道來幫助您。 這樣,他們可以使用MAXINST
/ MAXINSTC
通道參數限制應用程序的連接數。 當這個數字用盡時,你會得到一個例外,正如你所說的那樣。 其他應用程序將不再受到影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.