【发布时间】:2019-04-09 15:02:31
【问题描述】:
我们正在尝试建立从 tomcat 到 IBM MQSeries 的 jms 连接,以建立连接池。
我们已经按照下面的链接,给出了建议的解决方案:
WebSphere MQ connection pooling with Tomcat
我不知道我们如何使用建议的方法管理不同的jms连接,我们进行了测试,我们注意到CachingConnectionFactory管理不同的jms会话而不是jms连接。
我和你分享下面的链接,其中解释了 CachingConnectionFactory 不允许管理不同的 jms 连接,而只允许管理 jms 会话!
https://jira.spring.io/browse/SPR-13586
我也和大家分享一下,两个文件 context.xml(datasource 和 services.xml(spring services 文件)
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>
最好的问候。
【问题讨论】:
-
不,在我的问题中,ActiveMq 和 IBM MQ 之间没有混合。 tomcat 有内置的 JDBC 连接池,但遗憾的是没有内置的 JMS 连接池。我们尝试
-
你是对的,但只是写错了。我刚刚更正了豆子的名称。就像我说的,我希望能够管理池连接 jms。 CachingConnectionFactory 只能在后台维护 1 个 TCP 连接,我们希望在其下管理与多个会话/消费者/生产者的多个 TCP 连接,这对于高负载系统是必需的。
-
我们使用的jar如下:mq-7.0.0.jar, mqjms-7.0.0.jar
-
我们使用的jar如下:mq-7.0.0.jar, mqjms-7.0.0.jar
-
会话对我有用,但我们受到一个 jms 连接的限制,这意味着我们受到 10 个会话的限制。我认为每个 jms 连接只提供 10 个会话。在 MANIFEST.MF 的内容下方 jar mq-7.0.0.jar 和 mqjms-7.0.0.jar : 实施-标题:Java 消息服务规范的 WebSphere MQ 类-供应商:Sun Microsystems, Inc. 规范-版本:1.1实施-版本:6.0.2.11 - j600-211-110318 规范-版本:6.0.2.11 实施-版本:6.0.2.11 - j600-211-110318