Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Camel正在创建过多的tcp连接(超过15000个),处于“等待”状态,无法连接ActiveMQ_Java_Spring_Apache Camel_Activemq_Message Queue - Fatal编程技术网

Java Camel正在创建过多的tcp连接(超过15000个),处于“等待”状态,无法连接ActiveMQ

Java Camel正在创建过多的tcp连接(超过15000个),处于“等待”状态,无法连接ActiveMQ,java,spring,apache-camel,activemq,message-queue,Java,Spring,Apache Camel,Activemq,Message Queue,我在项目中使用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.RedeliveryPo

我在项目中使用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连接被及时打开。\n我与infra团队确认了这种情况,他们确认所有操作系统级别的配置都正常

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

我真正的问题是什么


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

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

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


这些是消费者连接还是生产者连接?据《每日电讯报》报道,it允许创建消费者,但实际上不会将他们集中在一起。这些是消费者连接。我认为这是可以的,因为它至少应该缓存TCP连接。正如您在JMSCOConfiguration中看到的一样,请注意这一行——“即使我的应用程序处于空闲状态,并且当时没有生成/使用任何消息”。所以实际上这些不是生产者,因为系统刚刚重新启动并处于空闲状态。在屏幕截图中我提到,即使在空闲的情况下,后台线程也在工作并调用-DefaultMessageListenerContainer。我刚刚发现您在tx管理器中使用(不是池)连接工厂。编辑我的回答谢谢你指出。我使用pooledConnectionFactory进行了测试,现在它运行良好。现在我意识到为什么我的项目的早期版本没有这样的问题。最近我无意中改变了这一点。