我正在尝试在spring / camel中为Websphere MQ配置JMS连接池。当我试图从spring使用CachingConnectionFactory时,我看到了类强制转换异常。无法从WMQ找到一个池,有没有人与WMQ建立连接池,我没有找到任何例子。 ActiveMQ有很多例子。
这是我到目前为止所做的,即产生类强制转换异常。
<bean id="inCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="inboundMqConnectionFactory1" />
<property name="sessionCacheSize" value="5" />
</bean>
<bean id="inboundWebsphereMq1" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="inCachingConnectionFactory" />
<property name="destinationResolver" ref="jmsDestinationResolver" />
<property name="transacted" value="true" />
<property name="transactionManager" ref="txManager1" />
</bean>
<bean id="inboundMqConnectionFactory1" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName" value="${isi.inbound.queue.host2}" />
<property name="port" value="${isi.inbound.queue.port}" />
<property name="queueManager" value="${isi.inbound.queue.queuemanager2}" />
<property name="channel" value="${isi.inbound.queue.channel2}" />
<property name="transportType" value="${isi.queue.transportType}" />
</bean>
我看到的例外是
试图恢复。原因:com.sun.proxy。$ Proxy37无法强制转换为com.ibm.mq.jms.MQQueueSession
答案 0 :(得分:6)
一般来说:
现在尝试一下:
<bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory"
p:queueManager="${QM_NAME}"
p:hostName="${QM_HOST_NAME}"
p:port="${QM_HOST_PORT}"
p:channel="${QM_CHANNEL}"
p:clientID="${QM_CLIENT_ID}">
<property name="transportType">
<util:constant static-field="com.ibm.msg.client.wmq.WMQConstants.WMQ_CM_CLIENT" />
</property>
</bean>
<bean id="userConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"
p:targetConnectionFactory-ref="mqConnectionFactory"
p:username="${QM_USERNAME}"
p:password="${QM_PASSWORD}" />
<!-- this will work -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"
p:targetConnectionFactory-ref="userConnectionFactory"
p:cacheConsumers="true"
p:reconnectOnException="true" />
当然,如果你想这样,你可以缓存会话而不是消费者。根据我的经验,WMQ会话缓存是可测量的性能改进,但前提是您在WMQ机器上的CPU功率或实际消息吞吐量受限;在大多数世界应用中,这两种情况都很少见。缓存消费者避免了过多的MQ OPEN调用,这对WMQ来说是一项昂贵的操作,所以它也有帮助。
我的经验法则是消费者+会话缓存性能优势等于连接缓存的性能优势的1/2,并且通常不会在您的日常JEE堆栈中追求,除非您的硬件有限。
从WMQ v7开始,与spring MC相比,异步使用者实际上非常快,没有CPU开销,如果你是HW限制的话,它们是消费消息的首选方式。大多数时候我仍然使用Spring,因为我更喜欢它的随和性。
希望它有所帮助。