[英]IBM MQSeries connection pooling with Tomcat
我們正在嘗試建立從tomcat到IBM MQSeries的jms連接,並關注連接池。
我們按照以下鏈接,建議的解決方案:
我不知道如何使用建議的方法管理不同的jms連接,我們已經進行了測試,並且我們注意到CachingConnectionFactory管理不同的jms會話而不是jms連接。
我與您分享下面的鏈接,其中解釋了CachingConnectionFactory不允許管理不同的jms連接,只是jms會話!
https://jira.spring.io/browse/SPR-13586
我也和大家分享了兩個文件context.xml(datasource和services.xml(spring services file))
的context.xml
<Resource name="jms/AN8.NOTI.MOBILE.01" auth="Container" type="org.springframework.jms.connection.CachingConnectionFactory"
factory="com.cl.fwk.jms.utilities.RSFCachingMQQueueConnectionFactoryFactory"
description="JMS Queue Connection Factory for sending messages" HOST="**********"
PORT="****" CHAN="******" TRAN="*" QMGR="***" />
<Resource name="jms/MQAN8.NOTI.MOBILE.01" auth="Container"
type="com.ibm.mq.jms.MQQueue" factory="com.ibm.mq.jms.MQQueueFactory"
description="JMS Queue for receiving messages from Dialog" QU="********" />
的services.xml
<!-- Ressource JNDI pour la connexion MQSeries-->
<bean id="xxxx.jmsRefConnectionFactory.mqseries" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jms/AN8.NOTI.MOBILE.01" />
<property name="resourceRef" value="true" />
</bean>
<!-- Ressource JNDI pour la file d'attente du broker MQSeries-->
<bean id="xxxx.jmsRefQueue.mqseries" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jms/MQAN8.NOTI.MOBILE.01" />
<property name="resourceRef" value="true" />
</bean>
<!-- A cached connection to wrap the MQSeries connection -->
<bean id="xxxx.jmsConnectionFactory.mqseries" class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- <constructor-arg ref="xxxx.jmsRefConnectionFactory.mqseries" /> -->
<property name="targetConnectionFactory" ref="xxxx.jmsRefConnectionFactory.mqseries"/>
<property name="sessionCacheSize" value="10" />
</bean>
<bean id="xxxx.jmsDestinationResolver.amq" class="org.springframework.jms.support.destination.DynamicDestinationResolver" />
<bean id="xxxx.jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="xxxx.jmsConnectionFactory.mqseries" />
<property name="defaultDestination" ref="xxxx.jmsRefQueue.mqseries" />
<property name="destinationResolver" ref="xxxx.jmsDestinationResolver.amq" />
<property name="sessionTransacted" value="true" />
<property name="sessionAcknowledgeMode" value="#{T(javax.jms.Session).AUTO_ACKNOWLEDGE}" />
</bean>
最好的祝福。
摘要
您需要升級到JMS的MQ類的更高版本,或讓MQ管理員增加MAXINST / MAXINSTC設置以允許更多通道實例。
請注意,您使用的版本自2012年以來一直不受支持,所以我建議升級。
Product Version Release End of Service
============ ======= ========== =================
Websphere MQ 6.0 2005-06-24 2012-09-30
背景信息來自評論
根據您在評論中提供的內容,您可以了解有關當前設置的以下信息:
IBM MQ Server version: 8.0.0.? (specific maintenance level unknown)
IBM MQ jar names: mq-7.0.0.jar and mqjms-7.0.0.jar
IBM MQ jar version: 6.0.2.11
SVRCONN Channel settings: SHARECNV(10) MAXINST(9) MAXINSTC(9)
請注意,即使jar文件的名稱包含字符串7.0.0,它們實際上來自IBM MQ v6.0.2.11(從技術上講,它當時稱為Websphere MQ)。
您指向的另一個StackOveflow問題“ 與Tomcat的WebSphere MQ連接池 ”引用了一個事實,即v7.0之前的IBM MQ(例如v6.0)提供了連接池,但是這在MQ v7.0中被刪除了,並且問是如何在v7.0及更高版本中獲得類似的功能。
v6連接池是MQ v6.0 JMS中的缺省值,如“ WebSphere MQ Using Java Version 6.0 ”手冊的第504頁所述:
setUseConnectionPooling
public void setUseConnectionPooling(boolean usePooling);
選擇是否使用連接池。 如果將此參數設置為true,則JMS會為通過ConnectionFactory創建的任何連接的生命周期啟用連接池。 這也會影響使用usePooling設置為false創建的連接; 要在整個JVM中禁用連接池,請確保JVM中使用的所有ConnectionFactories都將usePooling設置為false。
在MQ v7中刪除連接池的事實記錄在IBM MQ v8.0知識中心頁面中開發應用程序>開發JMS和Java平台,企業版應用程序>使用IBM MQ classes for JMS> IBM MQ classes for JMS> MQConnectionFactory類
setUseConnectionPooling
public void setUseConnectionPooling(boolean usePooling)
已過時。 JMS不再使用連接池。 應使用App Server提供的工具完成任何連接池。 在早期版本的WebSphere MQ classes for JMS中設置ConnectionPooling的使用。 保留此方法是為了與較舊的MQJMS應用程序兼容,但是,由於此連接池功能已從版本7中刪除,因此設置此屬性將不起作用。
要解釋您今天看到的行為,您還需要了解MQ v7.0中添加的MQ客戶端通道共享對話行為,您可以在IBM MQ v8.0知識中心頁面中閱讀此內容。 遷移和升級>簡介IBM MQ遷移>共存,兼容性和互操作性> MQI客戶端:客戶端連接和服務器連接通道的默認行為 。 引用以下幾個細節:
在V7.0中,客戶端和服務器連接通道的默認設置已更改為使用共享對話。 此更改會影響心跳和通道出口的行為,並可能對性能產生影響。
在V7.0之前,每個會話都分配給不同的通道實例。 從V7.0開始,客戶端和服務器連接的默認設置是共享MQI通道。 您可以使用SHARECNV(共享對話)參數指定可以通過特定TCP / IP客戶端通道實例共享的最大對話數。 可能的值如下:
SHARECNV(0)
- 此值指定不通過TCP / IP套接字共享對話。 通道實例的行為與版本6.0服務器或客戶端連接通道完全相同 ,並且您不會獲得額外的功能,例如將SHARECNV設置為1或更大時可用的雙向心跳。 如果在將SHARECNV設置為1或更大時,現有客戶端應用程序無法正確運行,則僅使用值0。
綜合這一點,您有一個SVRCONN頻道,其中包含以下設置:
SHARECNV(10)
MAXINST(9)
MAXINSTC(9)
當與MQ v7.0及更高版本的客戶端一起使用時,這些設置意味着您可以在客戶端和隊列管理器之間擁有9個通道實例(TCP連接),並且每個實例可以有10個共享對話,總共最多可以有90個對話。
因為您正在為JMS使用MQ v6.0類,所以通道的運行方式就像設置為:
SHARECNV(0)
MAXINST(9)
MAXINSTC(9)
這意味着客戶端和隊列管理器之間可以有9個通道實例(TCP連接),並且每個實例僅支持一個會話。
在JMS的MQ v6.0類中,每個基礎JMS連接以及在JMS連接之上創建的每個JMS會話都將為網絡管理器分配一個通道實例。
要了解有關連接和會話如何相互交互以及如何與SHARECNV設置進行交互的更多信息,請參閱IBM MQ v8.0知識中心頁面開發應用程序>開發JMS和Java平台,企業版應用程序>使用IBM MQ for JMS>編寫IBM JMS應用程序的MQ類>訪問IBM MQ功能>在JMS的IBM MQ類中共享TCP / IP連接 :
由JMS應用程序創建的每個JMS連接和JMS會話都會與隊列管理器創建自己的對話。
在您的情況下,因為您正在為JMS使用MQ v6.0類,所以每個“對話”都是到隊列管理器的MQ通道實例(TCP連接)。
我建議您獲取當前用於Java版本的IBM MQ類,這樣您最多可以擁有90個共享對話。 如果爭用是一個問題,您需要讓MQ管理員增加MAXINST
/ MAXINSTC
設置並減少SHARECNV
。
對於IBM MQ Classes for JMS,您可以在IBM MQ v9知識中心頁面“ 為JMS的IBM MQ類安裝的內容 ”頁面上找到所需的文件列表:
可重定位的JAR文件
在企業中,可以將以下文件移動到需要為JMS運行IBM MQ類的系統:
- com.ibm.mq.allclient.jar
- com.ibm.mq.traceControl.jar
- jms.jar
- fscontext.jar
- providerutil.jar
- Bouncy Castle安全提供商和CMS支持罐子
如果應用程序使用文件系統上下文執行JNDI查找,則需要fscontext.jar和providerutil.jar文件。
需要Bouncy Castle安全提供程序和CMS支持jar文件。 有關更多信息,請參閱對非IBM JRE的支持。
請注意,Redistributable客戶端中僅包含com.ibm.mq.allclient.jar
, jms.jar
和Bouncy Castle安全提供程序以及CMS支持jar,但所有這些都包含在Java All客戶端中。 你也運行9.0.0.0,我建議你去9.0.0.5。 您可以在Fix Central上找到Redistributable和Java All客戶端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.