camel在等待状态下创建太多tcp连接(超过15000个)以连接activemq

cwxwcias  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(260)

我正在项目中使用apachecamel(带spring)和activemq。以下是与jms/activemq相关的设置:
camel版本:activemq-camel-5.15.3.jar(所有activemq相关jar)
activemq版本:5.15.0

<!-- language: lang-xml -->
<bean id="defaultActiveMQRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
</bean>

<util:list id="redeliveryPolicyEntries">
    <bean id="activeMQRedeliveryPolicy1" class="org.apache.activemq.RedeliveryPolicy">
        <property name="queue" value="inbox"></property>
    </bean>
</util:list>

<bean id="amqRedeliveryPolicyMap"
    class="org.apache.activemq.broker.region.policy.RedeliveryPolicyMap">
    <property name="defaultEntry" ref="defaultActiveMQRedeliveryPolicy"></property>
    <property name="redeliveryPolicyEntries" ref="redeliveryPolicyEntries"></property>
</bean>

<bean id="amqPrefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
</bean>

<bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
    <property name="maxConnections" value="20" />
    <property name="maximumActiveSessionPerConnection" value="40" />
    <property name="connectionFactory" ref="jmsConnectionFactory">
    </property>
</bean>

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${jmsConnectionFactory.brokerURL}"  />
     <property name="userName" value="admin" /> 
     <property name="password" value="admin" /> 
    <property name="prefetchPolicy" ref="amqPrefetchPolicy" />
    <property name="redeliveryPolicyMap" ref="amqRedeliveryPolicyMap" />
</bean>

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory" />
    <property name="concurrentConsumers" value="15" />
    <property name="maxConcurrentConsumers" value="30" />
    <property name="asyncConsumer" value="false" />
    <property name="cacheLevelName"  value="CACHE_CONSUMER" />
</bean>

<!-- this bean actually represents a jms component to be used in our camel-integration 
    setup.make endpoints by using name(id) of this bean. -->
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig" />
    <property name="transacted" value="false" />
    <property name="transactionManager">
        <bean class="org.springframework.jms.connection.JmsTransactionManager">
            <property name="connectionFactory" ref="jmsConnectionFactory" />
        </bean>
    </property>         
</bean>

如您所见,我使用的是pooledconnectionfactory,因此我希望与activemq连接的连接数是固定的。但出乎意料的是,即使我的应用程序处于空闲状态并且没有消息生成/使用,我也没有看到大量tcp连接被及时打开。我和infra团队确认了这种情况,他们确认了所有操作系统级别的配置都很好。
在这里,我尝试调试abstractpollingmessagelistenercontainer中的doreceiveandexecute方法-sessiontouse不为null,consumertouse也不为null,代码流经receivemessage(行号304)。我在调试屏幕截图中所附的调试跟踪中找不到问题:

以及

我真正的问题是

是messagelistenercontainer问题还是connectionfactory问题??我是否缺少一些可以防止这种情况发生的配置,或者这是一个现有的问题?如果有,有解决办法吗?

kyvafyod

kyvafyod1#

刚刚在你的配置中发现 jmsConnectionFactory (不是池工厂)在事务管理器中。不确定这是否会引发问题,因为集合工厂根本没有被使用。

<property name="transactionManager">
    <bean class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
    </bean>
</property>

相关问题