2013-10-24 5 views
19

우리는 Tomcat (7.0.41)에서 ActiveMQ (5.8.0)와 함께 Spring (3.2.4)을 사용하고 어떤 용도로 사용되는지 명확하지 않습니다. JmsTemplate을 사용하여 메시지를 생성하고 MessageListenerContainer를 사용하여 메시지를 수신하려고합니다.

수신 측에서 캐싱을 사용해야합니까? (related link)
작동 CachingConnectionFactory ActiveMQ 및 장애 조치? (related link)
PooledConnectionFactory를 사용할 때 useAsyncSend = "true"로 설정해야합니까? (related link) here 가입일
어느 것이 더 낫습니다 : PooledConnectionFactory 또는 CachingConnectionFactory?

+0

나는 봄 (3.0.7), ActiveMQ를 (5.5.0)와 톰캣으로 훨씬 넘는 년 동안 메시지 생산 (이 JmsTemplate)과 소비 (DefaultMessageListenerContainer)에 대한 CachingConnectionFactory을 사용하고 문제를 경험 한 적이 없다. 일반적으로 고객은 queue_1에서 메시지를 처리하고 queue_2에 메시지를 게시하여 완료하지만 대기열 상호 작용은 동일한 CachingConnectionFactory를 사용합니다. – shuttsy

답변

30

:

PooledConnectionFactory 및 CachingConnectionFactory 차이는 구현의 차이이다. 다음은 그들 사이에 다른 특성의 일부입니다 :

  • 은 비록 PooledConnectionFactory하고 각 풀의 연결, 세션 및 생산자의 PooledConnectionFactory 실제로 여러 생산자의 캐시를 생성하지 않는다는 CachingConnectionFactory 상태 모두. 하나의 캐시 된 제작자가 요청 될 때 단일 캐시 패턴을 사용합니다. CachingConnectionFactory는 실제로 여러 개의 생성자를 포함하는 캐시를 생성하고 캐시에서 하나의 생성자를 요청할 때 캐시에서 하나의 생산자를 넘겨줍니다.

  • PooledConnectionFactory는 JMS 세션을 풀링하기 위해 Apache Commons Pool 프로젝트 위에 빌드됩니다. PooledConnectionFactory에서 사용하지 않는 기능이 Commons Pool에 있기 때문에 풀에 대한 추가 제어가 가능합니다. 이러한 추가 기능에는 블로킹 대신 풀 크기 증가, 풀이 고갈되었을 때 예외가 발생하는 등이 있습니다. 사용자 정의 된 설정을 사용하여 사용자 자신의 Commons Pool GenericObjectPool을 생성 한 다음이를 통해 PooledConnectionFactory로 해당 객체를 전달함으로써 이러한 기능을 활용할 수 있습니다. setPoolFactory 메소드. 추가 정보는 다음을 참조하십시오. http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html

  • CachingConnectionFactory는 또한 소비자를 캐시 할 수 있습니다. 이 기능을 사용할 때는 소비자가 블로그 게시물에 명시된 규칙에 따라 캐시되는지 알아야합니다.

  • 가장 중요한 것은 CachingConnectionFactory가 JMS 호환 MOM과 함께 작동한다는 것입니다. JMS 연결 팩토리 만 있으면됩니다. 이는 엔터프라이즈 조직에서 매우 일반적으로 사용되는 MOM 공급 업체를 두 개 이상 사용하는 경우 중요합니다 (주로 기존 및 기존 프로젝트로 인한 것임). 중요한 점은 CachingConnectionFactory가 ActiveMQ뿐만 아니라 다양한 MOM 구현과 잘 작동한다는 것입니다. here에서

:

  • 당신이 ActiveMQs 클러스터 한 사용 장애 조치 전송이가 CachingConnectionFactory가 올바른 선택이 아니라고보고 된 경우.

  • 제가하는 데 문제는 하나 개의 박스가 다운되면, 우리는 다른에 메시지를 보내는 를 시작해야한다는 것입니다,하지만 여전히 이전 연결을 (모든이 시간을 보낼)를 사용하는 것 같다. 프로그램을 다시 시작하면 이 다시 연결되며 모든 것이 작동합니다.자료 : Autoreconnect problem with ActiveMQ and CachingConnectionFactory

  • 문제는 실패의 ActiveMQ에 캐시 연결이 아직 사용 이었고, 그 사용자에 대한 문제를 만든 것입니다. 이제이 시나리오의 선택 사항은 PooledConnectionFactory입니다.

  • 오늘의 ActiveMQ를 사용하고, 기회는 당신이 미래의 어떤 다른 브로커 (보스 MQ는 WebSphere MQ)로 전환 할 수 에 밀접하게 결합 코드를 그것으로, PooledConnectionFactory을 사용하지 않는 것이 있다면 ActiveMQ.

+0

이것은 두 팩토리에 대한 전반적인 설명입니다. 그러나 몇 가지 의견을 추가 할 것입니다 : 리시버 쪽에서 캐싱을 사용해야합니까? ActiveMQ in Action 책에서 이것이 필요하지 않음을 발견했습니다. 작동 CachingConnectionFactory ActiveMQ 및 장애 조치? "자동 연결 문제 ..."링크에 포함 된 2 개의 답변이 맞지만 PooledConnectionFactory가 제대로 작동하는 것 같습니다. 따라서 다른 MOM을 사용할 계획이 아닙니다. PooledConnectionFactory를 사용할 때 useAsyncSend = "true"로 설정해야합니까? 아직 모르겠지만 설정되어 있으면 문제가되지 않습니다. :) – Krayo

+0

비동기 전송 : 각 메시지가 전송 된 에 대한 확인 대기를 차단하지 않도록 제작자에게 알립니다. http://activemq.apache.org/async-sends.html (문제가 아니어야 함) – united

+0

새로운 질문을 다른 질문으로 질문하는 것이 더 좋습니다.) – united

관련 문제