2012-05-03 4 views
4

저는 스프링 통합을 사용하여 활성 mq의 다른 쪽 끝에서 서비스를 호출합니다. 내가 발견 한 것은이 config로 소비자가 결코 가까운 활성 MQ에서 일치 요청을 잡기 위해 만든 것입니다스프링 통합을 사용하여 jms 소비자를 닫는 올바른 방법은 무엇입니까?

<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
     <constructor-arg> 
      <bean class="org.apache.activemq.ActiveMQConnectionFactory" 
        p:brokerURL="${risk.approval.queue.broker}" 
        p:userName="${risk.approval.queue.username}" 
        p:password="${risk.approval.queue.password}" 
        /> 
     </constructor-arg> 
     <property name="reconnectOnException" value="true"/> 
     <property name="sessionCacheSize" value="100"/> 
    </bean> 

    <!-- create and close a connection to prepopulate the pool --> 
    <bean factory-bean="jmsConnectionFactory" factory-method="createConnection" class="javax.jms.Connection" 
      init-method="close" /> 

    <integration:channel id="riskApprovalRequestChannel"/> 
    <integration:channel id="riskApprovalResponseChannel"/> 

    <jms:outbound-gateway id="riskApprovalServiceGateway" 
          request-destination-name="${risk.approval.queue.request}" 
          reply-destination-name="${risk.approval.queue.response}" 
          request-channel="riskApprovalRequestChannel" 
          reply-channel="riskApprovalResponseChannel" 
          connection-factory="jmsConnectionFactory" 
          receive-timeout="5000"/> 

    <integration:gateway id="riskApprovalService" service-interface="com.my.super.ServiceInterface" 
         default-request-channel="riskApprovalRequestChannel" 
         default-reply-channel="riskApprovalResponseChannel"/> 

:처럼 내 설정 보인다. 모든 요청은 소비자 수를 증가시킵니다.

은 내가 CachingConnectionFactory에

<property name="cacheConsumers" value="false" /> 

을 추가하여 이런 일이 발생 중지 할 수 있습니다. 그러나 CachingConnectionFactory를위한 자바 문서에 따라

: 영구 가입자 만 세션 핸들의 논리적 폐쇄 될 때까지 캐시됩니다

참고.

이는 세션이 절대로 닫히지 않는다고 제안합니다.

이것은 나쁜 것입니까? 소비자가 쌓이는 것을 막을 수있는 더 좋은 방법이 있습니까?

건배, 피터 당신이 당신의 공장 콩에 초기화-방법이 필요하지 않습니다,

답변

3

첫 번째 - 그것은 아무것도하지 않는다 - 그것에 세션 공장은 하나 개의 연결 만 가지고 (가까운 전화)은 '아니오' -op. (CCF는 SingleConnectionFactory의 서브 클래스입니다).

둘째로; 소비자 캐싱이 기본값입니다. 세션 수가 sessionCacheSize (100으로 설정)를 초과하지 않는 한 세션은 절대로 닫히지 않습니다.

캐시 된 세션에서 close()가 호출되면 다시 사용할 수 있도록 캐싱됩니다. 캐싱 연결 팩토리가 인 경우 이므로 모든 요청에 ​​대해 세션 생성의 오버 헤드가 발생하지 않습니다.

캐시 세션, 생성자 및 사용자의 성능 이점을 원하지 않으면 대신 SingleConnectionFactory를 사용하십시오. CachingConnectionFactory에 대한 JavaDoc을 참조하십시오.

+0

좋은 정보 주셔서 감사합니다. 소비자를 닫는 이유는 모두 상관 ID 선택자가 있기 때문에 결코 재사용 할 수 없다는 것입니다. 다른 소비자가 없다는 것을 감안할 때 제안한대로 SingleConnectionFactory로 전환 할 것입니다. –

+0

그러나 세션 및 제작자의 캐싱도 손실됩니다. cacheConsumers = false 인 캐싱 연결 팩토리를 사용하여 실제로 올바른 작업을 수행하고있었습니다. 그렇게하면 두 세계의 장점을 모두 누릴 수 있습니다. –

0

cachingConnectionFactory을 사용할 때 다음이 작동합니까? 귀하의 스프링 설정 파일에서

는 다음과 같이 연결 팩토리 설정 정보 뭔가를 추가 : cacheConsumers="false"

기본 동작은 대기열에서 연결 누수의 원인이되었다 사실입니다.