私たちはこれでいつか苦労しています。以下は、当社の構成です:spring-amqpを使用したRabbit MQブローカーとの接続を閉じるには
<?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コードから接続ファクトリにアクセスし、破壊する方法を実行しようとすると、接続は閉じないでください。さらに、その接続ファクトリのオープン接続を調べると、開いている接続は表示されませんが、実際にはrabbitmqには1つのオープン接続があります。
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>
この要件が原因で接続が遮断され得るとき、我々は代替ブローカーに移行するためのオプションを提供したいここで独特の状況を生じます。したがって、現在の接続を閉じて、代替ブローカとの新しい接続を確立する必要があります。詳しい情報が必要な場合はお知らせください。
Garyのソリューションに加えて、jdk 1.7リソース(Autocloseable)を試して接続を解放/閉じることもできます。 –
ちょっとゲイリー私は1.5.2.RELEASEにアップグレードしようとしましたが、resetConnection()にはまだ運がありません。 OpenConnectionsがまだ0になっています。あなたは、AMQP接続についての詳細な情報を提供するいくつかのソースに向けることができます。 – manu
私が言ったように、あなたはネットワークモニタを見る必要があります - Spring AMQPの観点からは、接続は常にdestroy()とresetConnection()によって閉じられます。 DEBUGまたはTRACEログを有効にして、手がかりを得ることもできます。あなたがまだそれを理解できないならば。問題を示す小さなテストアプリを投稿してください。 –