【问题标题】:Camel creating too many tcp connections (over 15000) in TIME_WAIT status to connect ActiveMQCamel 在 TIME_WAIT 状态下创建了太多的 tcp 连接(超过 15000)来连接 ActiveMQ
【发布时间】:2019-05-08 05:58:36
【问题描述】:

我在项目中使用 Apache Camel(带有 Spring)和 ActiveMQ。以下是与 JMS/ActiveMQ 相关的设置:

骆驼版本: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 连接。 我向 infra 团队确认了这种情况,该团队确认了所有 操作系统级别的配置没问题。

这里我尝试调试 AbstractPollingMessageListenerContainer 中的 doReceiveAndExecute 方法 - sessionToUse 不为空,consumerToUse 也不null 和代码流经 receiveMessage(行号 304)。我在调试跟踪中找不到问题,如调试屏幕截图中所附:

还有我的实际问题

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

【问题讨论】:

  • 这些是消费者还是生产者连接?根据documentation of PooledConnectionFactory,它允许创建消费者,但实际上不会汇集它们。
  • 这些是消费者连接。我认为这没关系,因为它至少应该缓存 TCP 连接。同样如您所见,我在 jmsConfiguration 中给出了

标签: java spring apache-camel activemq message-queue


【解决方案1】:

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

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

【讨论】:

  • 请注意这一行 - “即使我的应用程序处于空闲状态并且当时没有生成/使用任何消息”。所以实际上这些不是生产者,因为系统刚刚重新启动并处于空闲状态。在屏幕截图中我提到即使在空闲情况下后台线程也在工作并调用 -DefaultMessageListenerContainer。
  • 我刚刚发现您在您的 tx 管理器中使用(非池化)连接工厂。编辑了我的答案
  • 感谢您的指出。我用 pooledConnectionFactory 进行了测试,现在它工作正常。现在我意识到为什么我的项目的早期版本没有这样的问题。我最近不小心改变了它。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2010-12-16
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多