2016-07-24 3 views
1

Мы сейчас боремся с этим. Ниже наша конфигурация:Как закрыть соединение с брокером MQ-брокер, используя весну-amqp

<?xml version="1.0" encoding="UTF-8" ?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" 

     xsi:schemaLocation="http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.1.xsd 
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd" xmlns:context="http://www.springframework.org/schema/context"> 

<context:property-placeholder location="../spring.properties" /> 

<rabbit:connection-factory id="connectionFactory" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.virtualhost}" port="${app.mq.port}"/> 

<rabbit:connection-factory id="connectionFactorySettlement" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.settlementVirtualHost}" port="${app.mq.port}"/> 

<rabbit:connection-factory id="connectionFactoryAuth" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.oAuthVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryVault" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.vaultVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryWebservice" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.webserviceVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryCMS" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.cmsVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryTreasury" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.treasuryVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryBankVault" host="${app.mq.host}" username="${app.mq.username}" 
          password="${app.mq.password}" virtual-host="${app.mq.bankVaultVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryAnalyticsData" host="${app.mq.analytics_host}" username="${app.mq.analytics_username}" 
           password="${app.mq.analytics_password}" virtual-host="${app.mq.analyticsdataVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryChat" host="${app.mq.host}" username="${app.mq.username}" 
           password="${app.mq.password}" virtual-host="${app.mq.chatVirtualHost}" port="${app.mq.port}" /> 

<rabbit:connection-factory id="connectionFactoryFittipaldi" host="${app.mq.fittipaldi_host}" username="${app.mq.fittipaldi_username}" 
          password="${app.mq.fittipaldi_password}" virtual-host="${app.mq.fittipaldiVirtualHost}" port="${app.mq.port}" /> 

<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateSettlement" connection-factory="connectionFactorySettlement" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateCMS" connection-factory="connectionFactoryCMS" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateVault" connection-factory="connectionFactoryVault" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateTreasury" connection-factory="connectionFactoryTreasury" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateWebservice" connection-factory="connectionFactoryWebservice" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateBankVault" connection-factory="connectionFactoryBankVault" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateAnalyticsData" connection-factory="connectionFactoryAnalyticsData" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateChat" connection-factory="connectionFactoryChat" reply-timeout="10" /> 
<rabbit:template id="rabbitTemplateAuth" connection-factory="connectionFactoryAuth" reply-timeout="1" /> 
<rabbit:template id="rabbitTemplateFitti" connection-factory="connectionFactoryFittipaldi" reply-timeout="5" /> 

<rabbit:admin connection-factory="connectionFactory" /> 

</beans> 

Когда мы пытаемся открыть фабрику соединений из кода Java и выполнить метод уничтожения, соединения не закрываются. Более того, когда мы проверяем открытые соединения для этой фабрики соединений, он не показывает открытых соединений, но на кроличнике на практике есть одно открытое соединение.

RabbitTemplate rabbitTemplate = (RabbitTemplate) rabbitTemplateMap.get(String.valueOf(key)); 
CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory) rabbitTemplate.getConnectionFactory(); 
cachingConnectionFactory.destroy(); 

Вышеупомянутый фрагмент кода не удается закрыть соединения. Мы используем следующую зависимость:

<dependency> 
    <groupId>org.springframework.amqp</groupId> 
    <artifactId>spring-rabbit</artifactId> 
    <version>1.3.9.RELEASE</version> 
</dependency> 

Это требование возникает из-за своеобразной ситуации, в которой когда соединения блокируются, мы хотим, чтобы обеспечить возможность переложить на компенсационную брокера. Следовательно, мы должны закрыть текущие соединения и установить новые связи с заменяющим брокером. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

ответ

2

1.3.9 - довольно старая версия (текущая версия 1.6.1).

Однако, я не знаю никаких проблем с закрытием соединения с помощью метода destroy(). В 1.5 мы добавили resetConnection(), который имеет менее страшное имя, но он делает то же самое, что и destroy().

Если у вас есть контейнеры-слушатели, соединение будет немедленно восстановлено после сброса; аналогично, если сообщение опубликовано с шаблоном, соединение будет воссоздано.

Если вы все еще чувствуете, что есть проблема, я предлагаю вам использовать сетевой монитор, такой как wirehark или tcpdump, чтобы узнать, что происходит.

+0

В дополнение к решению Гэри также используйте утилиту jdk 1.7 с ресурсами (Autocloseable) для освобождения/закрытия соединений. –

+0

Эй, Гэри, я попробовал обновить до 1.5.2.RELEASE, но все еще не повезло с resetConnection(). Все еще получается 0 openConnections. Можете ли вы направить в какой-то источник, который содержит подробные сведения о соединении AMQP. – manu

+0

Как я уже сказал, вам нужно посмотреть на сетевой монитор - с точки зрения Spring AMQP соединение всегда закрывается 'destroy()' и 'resetConnection()'. Вы также можете включить ведение журнала DEBUG или TRACE, что может дать вам некоторые подсказки. Если вы все еще не можете понять это; пожалуйста, напишите небольшое тестовое приложение, которое обнаруживает проблему. –