CachingConnectionFactory和DefaultMessageListenerContainer的问题

时间:2016-11-01 10:53:57

标签: java spring performance spring-integration spring-jms

DefaultMessageListenerContainer类的文档中提到,建议不要将CachingConnectionFactory与动态扩展一起使用。在搜索时,我遇到了以下链接:

Why DefaultMessageListenerContainer should not use CachingConnectionFactory?

以下是来自Gary Russell的评论

  

问题在于在容器中使用变量并发时缓存消费者;我们可以最终得到一个真实的消费者"卡住"在缓存中#34;

我们一起使用了DefaultMessageListenerContainerCachingConnectionFactory,所以这肯定是上述链接的问题。

我们的应用程序遇到以下行为时遇到问题:

  • TCP ZeroWindow网络拥塞
  • 从应用程序服务器到MQ的TCP RESET
  • 数据库连接在问题期间增长,而不同的事务停止
  • 某些队列中的邮件已建立

我们有以下代码配置:

  1. 在ibmmq-context.xml文件中:

    <!-- WebSphere MQ Connection Factory -->
    <bean id="appMqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
       <property name="hostName">
           <value>${ibmmq.ip}</value>
       </property>
       <property name="port">
           <value>${ibmmq.port}</value>
       </property>
       <property name="queueManager">
           <value>${ibmmq.queuemanager}</value>
       </property>
       <property name="channel"> 
    <value>${ibmmq.channel}</value> 
    </property>
       <property name="clientReconnectOptions"> 
    <util:constant static-field="com.ibm.msg.client.wmq.WMQConstants.WMQ_CLIENT_RECONNECT"/> 
    </property>
    <property name="transportType" ref="appTransport"/>
    </bean>
    
    <!-- A cached connection  -->
        <bean id="appCachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
            <property name="targetConnectionFactory" ref="appMqConnectionFactory"/>
            <property name="sessionCacheSize" value="${jms.session.cachesize}"/>
        </bean>
    
        <!--  Use native MQ classes. -->
    <bean id="appTransport" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="staticField">
    <value>com.ibm.mq.jms.JMSC.MQJMS_TP_CLIENT_MQ_TCPIP</value>
    </property>
    </bean>
    
  2. 在jms-context文件中:

    <bean id="bankListener"  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
      <property name="connectionFactory" ref="cachedConnectionFactory" />
      <property name="destination" ref="transactionResponseDestination" />
      <property name="messageListener" ref="thirdpartyService" />
      <property name="autoStartup" value="false"/>
      <property name="taskExecutor" ref="listenerExecutor"/>
      <property name="concurrency" value="20-30"/>
    </bean>
    
  3. 有6个像bankListener这样的监听器,每个监听器都有并发值,从10-40不等

    <bean id="listenerExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
      <property name="maxPoolSize" value="140"/>
      <property name="corePoolSize" value="100"/>
      <property name="queueCapacity" value="30"/>
      <property name="threadNamePrefix" value="jms-listener-task-"/>
      <property name="threadGroupName" value="jms-listener-tasks"/>
    </bean>
    

    jms-context.xml文件使用ibmmq-context.xml文件。

    1. 请注意,我们使用了IBM MQ 7.1,Spring 4.2.8,spring-integration-core作为4.3.1.RELEASE和JBoss EAP 6.4.10
    2. 我们计划通过以下方式解决此问题:

      <bean id="bankListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="appMqConnectionFactory" />
        <property name="destination" ref="transactionResponseDestination" />
        <property name="messageListener" ref="thirdpartyService" />
        <property name="autoStartup" value="false"/>
        <property name="taskExecutor" ref="listenerExecutor"/>
        <property name="concurrency" value="20-30"/>
      </bean>
      

      我的要求:

      1. 请查看配置并告诉我还有什么需要更改的。

      2. 请您使用CachingConnectionFactoryDefaultMessageListenerContainer

      3. 的当前配置,解释我们的应用行为(超过4分 - a到d)

        提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试设置:

cachingConnectionFactory.setCacheConsumers(false);

或者在春季应该是:

<bean id="appCachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    ...
    <property name="cacheConsumers" value="false"/>
    ...
</bean>