使用带有CachingConnectionFactory的DefaultMessageListenerContainer的性能问题

问题描述 投票:0回答:2

在我们的应用程序中,我们使用SingleConnectionFactory和从MQ MQ服务器消耗的DefaultMessageListenerContainer,性能方面应用程序表现相当不错,但是在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>

我们使用cachingConnectionFactory修复了MQ的泄漏连接问题,但是使用以下设置降低了性能。

<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" />

你能否建议我们可以做些什么来提高性能......

spring-integration spring-jms
2个回答
0
投票

尝试使用此而不是缓存或单个:

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

0
投票

这是我们对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> 
© www.soinside.com 2019 - 2024. All rights reserved.