簡體   English   中英

如何限制與 IBM MQ 的連接數

[英]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中的MaxChannelsMaxActiveChannels參數)。 他們可以通過定義您的應用程序專用的 MQ 通道來幫助您。 這樣,他們可以使用MAXINST / MAXINSTC通道參數限制應用程序的連接數。 當這個數字用盡時,你會得到一個例外,正如你所說的那樣。 其他應用程序將不再受到影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM