如何配置(弹簧)WMQ的JMS连接池

时间:2014-04-15 14:01:44

标签: spring connection-pooling ibm-mq

我正在尝试在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

1 个答案:

答案 0 :(得分:6)

一般来说:

  • 不要使用 QueueConnectionFactory TopicConnectionFactory ,因为 ConnectionFactory (JMS 1.1)替代
  • 来自v7 WMQ JMS客户端jar的每个ConnectionFactory都为每个人提供缓存逻辑,所以一般来说你不需要CachingConnection Factory。

现在尝试一下:

<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,因为我更喜欢它的随和性。

希望它有所帮助。

相关问题