【问题标题】:how to configure (spring) JMS connection Pool for WMQ如何为 WMQ 配置(spring)JMS 连接池
【发布时间】:2014-05-29 22:37:59
【问题描述】:

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

【问题讨论】:

  • 这个帖子说已经取消了pooling支持,不知道为什么。 stackoverflow.com/questions/8922339/…
  • 是的。你需要实现你自己的。检查此技术说明。 www-01.ibm.com/support/docview.wss?uid=swg21665128
  • 您好 nsupathy 感谢您的指点,这帮助我理解了原因。能否指点一下我自己使用spring配置的方法?
  • 我解决了我的类转换问题,它在我的 DestinationResolver 中转换它,但是使用缓存池它正在获取代理。我更新了目标解析器中的代码并创建了池。

标签: spring connection-pooling ibm-mq


【解决方案1】:

一般来说:

  • 不要使用 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 开销,并且如果您的硬件有限,这是使用消息的首选方式。大多数时候我仍然使用 Spring,因为我更喜欢它的随和性。

希望对你有帮助。

【讨论】:

  • 根据 Sping docs:docs.spring.io/spring/docs/current/javadoc-api/org/… "... 不要将 Spring 的 CachingConnectionFactory 与动态缩放结合使用。理想情况下,不要将它与消息侦听器容器一起使用,因为它是通常最好让侦听器容器本身在其生命周期内处理适当的缓存。"
猜你喜欢
  • 2014-11-16
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
相关资源
最近更新 更多