2016-07-24 15 views
1

私たちはこれでいつか苦労しています。以下は、当社の構成です: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> 

この要件が原因で接続が遮断され得るとき、我々は代替ブローカーに移行するためのオプションを提供したいここで独特の状況を生じます。したがって、現在の接続を閉じて、代替ブローカとの新しい接続を確立する必要があります。詳しい情報が必要な場合はお知らせください。

答えて

2

1.3.9はかなり古いリリースです(現在のバージョンは1.6.1です)。

ただし、私はdestroy()メソッドを使用して接続を閉じる際の問題について認識していません。 1.5では、resetConnection()という名前を付けましたが、これはあまり怖い名前ではありませんが、destroy()と同じことをします。

リスナーコンテナがある場合は、リセット後すぐに接続が再確立されます。同様に、メッセージがテンプレートと共に公開されると、接続は再作成されます。

まだ問題があると思われる場合は、wiresharkやtcpdumpなどのネットワークモニタを使用して何が起こっているのかを確認することをおすすめします。

+0

Garyのソリューションに加えて、jdk 1.7リソース(Autocloseable)を試して接続を解放/閉じることもできます。 –

+0

ちょっとゲイリー私は1.5.2.RELEASEにアップグレードしようとしましたが、resetConnection()にはまだ運がありません。 OpenConnectionsがまだ0になっています。あなたは、AMQP接続についての詳細な情報を提供するいくつかのソースに向けることができます。 – manu

+0

私が言ったように、あなたはネットワークモニタを見る必要があります - Spring AMQPの観点からは、接続は常にdestroy()とresetConnection()によって閉じられます。 DEBUGまたはTRACEログを有効にして、手がかりを得ることもできます。あなたがまだそれを理解できないならば。問題を示す小さなテストアプリを投稿してください。 –

関連する問題