Верблюд создает слишком много TCP-соединений (более 15000) в состоянии TIME_WAIT для подключения ActiveMQ - PullRequest
0 голосов
/ 06 декабря 2018

Я использую Apache Camel (с Spring) и ActiveMQ в проекте.Вот настройки, относящиеся к JMS / ActiveMQ:

Версия Camel: activemq-camel-5.15.3.jar (все банки, связанные с ActiveMQ)

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-соединений, открываемых в TIME_WAIT, даже когда мое приложение бездействует, и в это время сообщения не создаются и не потребляются. Я подтвердил эту ситуацию с помощью инфра-команды, которая подтвердила все Операционная система Конфигурация уровня в порядке.

Здесь я попытался отладить метод doReceiveAndExecute в AbstractPollingMessageListenerContainer - sessionToUse не равно нулю, consumerToUse также не равно нулюи код проходит через receiveMessage (номер строки 304). Я не смог найти проблему в трассировке отладки, как показано на снимках экрана отладки:

AbstractPollingMessageListenerContainer debug

и

JmsDestinationAccessor debug

и моя актуальная проблема

My actual problem

Это проблема с MessageListenerContainer или с ConnectionFactory ??Я пропустил какую-то конфигурацию, которая могла бы предотвратить это, или это существующая проблема?Если так, есть ли обходной путь?

1 Ответ

0 голосов
/ 11 декабря 2018

Только что заметил в вашей конфигурации, что вы настроили jmsConnectionFactory (не объединенную фабрику) в вашем менеджере транзакций.Не уверен, что это может поднять проблему, потому что объединенная фабрика просто не используется.

<property name="transactionManager">
    <bean class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
    </bean>
</property> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...