簡體   English   中英

與Tomcat的IBM MQSeries連接池

[英]IBM MQSeries connection pooling with Tomcat

我們正在嘗試建立從tomcat到IBM MQSeries的jms連接,並關注連接池。

我們按照以下鏈接,建議的解決方案:

與Tomcat的WebSphere MQ連接池

我不知道如何使用建議的方法管理不同的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.jarjms.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.

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