Camel 在 TIME_WAIT 状态下创建过多的 tcp 连接(超过 15000 个)以连接 ActiveMQ
Camel creating too many tcp connections (over 15000) in TIME_WAIT status to connect ActiveMQ
我在项目中使用 Apache Camel(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 连接的连接数固定。 但出乎意料的是,我在 TIME_WAIT 中看到大量未打开的 TCP 连接,即使我的应用程序处于空闲状态并且当时 produced/consumed 没有任何消息。 我确认了这一点基础设施团队的情况已确认所有 操作系统 级别配置均正常。
这里我尝试调试AbstractPollingMessageListenerContainer中的doReceiveAndExecute方法- sessionToUse不为空, consumerToUse 也不为空,代码流经 receiveMessage(行号 304)。我无法在调试截图中找到调试跟踪中的问题:
和
还有我的实际问题
是 MessageListenerContainer 还是 ConnectionFactory 有问题??我是否缺少一些可以防止这种情况发生的配置,或者这是一个现有问题?如果是这样,有解决方法吗?
刚刚在您的配置中发现您在事务管理器中配置了 jmsConnectionFactory
(不是池化工厂)。不确定这是否会引发问题,因为根本没有使用池工厂。
<property name="transactionManager">
<bean class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
</property>
我在项目中使用 Apache Camel(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 连接的连接数固定。 但出乎意料的是,我在 TIME_WAIT 中看到大量未打开的 TCP 连接,即使我的应用程序处于空闲状态并且当时 produced/consumed 没有任何消息。 我确认了这一点基础设施团队的情况已确认所有 操作系统 级别配置均正常。
这里我尝试调试AbstractPollingMessageListenerContainer中的doReceiveAndExecute方法- sessionToUse不为空, consumerToUse 也不为空,代码流经 receiveMessage(行号 304)。我无法在调试截图中找到调试跟踪中的问题:
和
还有我的实际问题
是 MessageListenerContainer 还是 ConnectionFactory 有问题??我是否缺少一些可以防止这种情况发生的配置,或者这是一个现有问题?如果是这样,有解决方法吗?
刚刚在您的配置中发现您在事务管理器中配置了 jmsConnectionFactory
(不是池化工厂)。不确定这是否会引发问题,因为根本没有使用池工厂。
<property name="transactionManager">
<bean class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
</property>