Проблема с производительностью при использовании DefaultMessageListenerContainer с CachingConnectionFactory - PullRequest
0 голосов
/ 07 марта 2019

В нашем приложении мы используем SingleConnectionFactory с DefaultMessageListenerContainer, потребляющим данные с сервера IBM MQ, с точки зрения производительности приложение довольно неплохо, однако в конце MQ наше приложение случайным образом открывает слишком много новых соединений.Вот текущая конфигурация, которую мы имеем.

<bean id="primary" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="primaryConnectionFactory"/>
        <property name="destinationName" value="CCS.COMM.FEED.FULFILLMENT"/>
        <property name="transactionManager" ref="primaryTransactionManager" />   
        <property name="sessionTransacted" value="true" />   
        <property name="concurrentConsumers" value="10" />
        <property name="maxConcurrentConsumers" value="10" />
        <property name="autoStartup" value="true" />
        <property name="recoveryInterval" value="60000" />
        <property name="cacheLevelName" value="CACHE_CONSUMER" />        
    </bean>  

<bean id="primaryConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
      <property name="targetConnectionFactory" ref="primaryRawInputConnectionFactory" />
      <property name="reconnectOnException" value="true" />
   </bean>

Мы исправили проблему с утечкой соединения с MQ, используя cachingConnectionFactory, однако производительность снижается при следующих настройках.

<bean id="inboundConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
      <property name="targetConnectionFactory" ref="inboundConnectionFactoryAdapter" />
      <property name="sessionCacheSize" value="10" />
   </bean>

    <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="inboundConnectionFactory" />
    </bean>

    <bean id="inboundListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="inboundConnectionFactory"/>
        <property name="destinationName" value="CCS.COMM.FEED.FULFILLMENT"/> 
        <property name="transactionManager" ref="jmsTransactionManager" />   
        <property name="sessionTransacted" value="true" />   
        <property name="concurrentConsumers" value="10" />
        <property name="maxConcurrentConsumers" value="10" />
        <property name="autoStartup" value="true" />

Не могли бы вы, пожалуйстаподскажите, что можно сделать, чтобы улучшить производительность ...

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Вот что мы имеем для primaryRawInputConnectionFactory

 <bean id="primaryRawInputConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
      <property name="targetConnectionFactory" ref="innboundTargetConnectionFactory"/>
      <property name="username" value="${jms.input.userid}" />
      <property name="password" value="${jms.input.password}" />
   </bean>

   <bean id="innboundTargetConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
      <property name="jndiTemplate" ref="inboundJmsJndiTemplate"/>
      <property name="jndiName" value="${jms.input.connection.factory.name}"/>
      <property name="lookupOnStartup" value="false"/>
      <property name="proxyInterface" value="javax.jms.ConnectionFactory"/>
   </bean>

   <bean id="inboundJmsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
      <property name="environment">
         <props>
            <prop key="java.naming.factory.initial">com.ibm.mq.jms.context.WMQInitialContextFactory</prop>
            <prop key="java.naming.provider.url">${jms.input.server.url}</prop>
            <prop key="java.naming.security.principal">${jms.input.userid}</prop>
            <prop key="java.naming.security.credentials">${jms.input.password}</prop>
         </props>
      </property>
   </bean> 
0 голосов
/ 07 марта 2019

Попробуйте использовать это вместо кэширования или сингла:

<bean id="connectionFactory" class="org.springframework.jms.connection.DelegatingConnectionFactory">
    <property name="targetConnectionFactory" ref="primaryRawInputConnectionFactory" />
    <property name="shouldStopConnections" value="true"/>
</bean>
...