2012-12-20 1 views
3

cms::MessageConsumercms::MessageProducer을 같은 프로세스의 다른 스레드에서 실행하고 싶습니다.ActiveMQ는 안전합니까?

어떻게 안전하게 처리 할 수 ​​있습니까?

두 개의 cms::Connection 개체와 두 개의 cms::Session 개체 (소비자 및 생산자 각각 하나)가 안전을 보장하기에 충분합니까? 필요한가?

정적 라이브러리 수준에서 이러한 유형의 사용을 방해하는 개체간에 공유 상태가 있습니까?

답변

4

JMS v1.1 사양을 읽으면 어떤 스레드가 여러 스레드에서 사용하기에 적합하고 어떤 스레드가 유효하지 않은지 명확하게 알려줍니다. 즉, Session, MessageConsumer 및 MessageProducer는 스레드간에 공유하기에 안전하지 않은 것으로 간주됩니다. 우리는 일반적으로 스레드를 안전하게 만들려고 노력하지만 확실한 방법으로 문제를 해결할 수 있습니다. 일반적으로 각 스레드에서 단일 세션을 사용하는 것이 좋습니다. 일반적으로 Session에는 단일 발송 스레드가 포함되어 있으므로 많은 MessageConsumer/MessageProducer에 대해 세션을 사용하는 것이 좋습니다. 이는 많은 소비자와의 세션에서 발송 스레드를 공유해야한다는 것을 의미합니다. 시나리오에 따라 대기 시간을 줄일 수있는 각 소비자에게 메시지를 보냅니다.

+0

마지막 문장을 명확히하십시오. – ThomasMcLeod

+0

더 많은 것을 추가했습니다. 블로그 게시물과 사양에 이미이 내용이 많이 있으므로 여기에이 코드를 모두 재현하지 않겠습니다. –

2

는 지금까지 내가 자바 측에서 알고있는 한, 연결는 스레드로부터 안전하지 않는 안전 (만들 오히려 비싼) 스레드하지만 세션메시지 생성자입니다. 따라서 각 스레드에 대해 Session을 만들어야합니다.

+2

이 점에 대해 알고 계십니까? – ThomasMcLeod

4

필자가 필수적인 정보를 제공 한 것으로 받아들이는 팀 비쉬 (Tim Bish)의 대답을 보완하기 위해 내 자신의 질문에 대답하고 있습니다. http://activemq.apache.org/cms/cms-api-overview.html

CMS 란에서

?

CMS API는 Java의 JMS API에 대한 결과로서 은 네트워크를 통해 클라이언트에 메시지를 보내고 받거나 같은 컴퓨터에있는 에 사용됩니다. CMS에서 은 가능한 한 JMS API와 동일한 수준의 패리티를 유지하려고 시도했으며 JMS 기능이 Java 프로그래밍 언어 자체의 기능에 크게 의존하는 경우에만 으로 분기되었습니다. 의 차이점은 대부분 있지만 CMS는 대부분 사양을 따르기 때문에 JMS 작동 방식에 대한 확고한 이해를 통해 CMS 을 훨씬 쉽게 사용할 수 있습니다.

스레드 사양에 대한 JMS 사양은 무엇을 말합니까? 여기

다운로드 사양 : http://download.oracle.com/otndocs/jcp/7195-jms-1.1-fr-spec-oth-JSpec/

2.8 멀티 스레딩 JMS는 모든 객체가 동시 사용을 지원하는 것이 필요 할 수 있었다. 일반적으로 동시 액세스에 대한 지원이이기 때문에 일부 오버 헤드와 복잡성이 추가되므로 JMS 설계에서는 을 다중 스레드 클라이언트에서 자연스럽게 공유 할 수있는 객체에 대한 동시 액세스 요구 사항을 으로 제한합니다. 나머지는 한 번에 하나의 제어 논리 스레드에 의해 액세스되도록 설계된 입니다. JMS는 세션의 동시 사용을 제한하는 몇 가지 특정 규칙을 정의합니다. YES

  • ConnectionFactory를 : YES
  • 연결 : YES
  • 우리가

    에서 동시 사용

    • 대상을 지원

      표 2-2 JMS 개체를 제시 보다 그들은 JMS의 특성의 더 많은 지식을 요구하기 때문에

    • 세션 : NO
    • MessageProducer : 아니오
    • 메시지 수신자 : 아니오

    이 점에 대해서는, 후술한다. 여기에 논리적 근거를 설명합니다.

    세션에 대한 동시 액세스를 제한하는 데는 두 가지 이유가 있습니다. 먼저 세션은 트랜잭션을 지원하는 JMS 엔터티입니다. 다중 스레드 된 트랜잭션을 구현하기가 매우 어렵습니다. 둘째, 세션은 비동기 메시지 소비를 지원합니다. 은 JMS가 비동기 메시지 용으로 사용 된 클라이언트 코드가 여러 개의 동시 메시지를 처리 ​​할 필요가 없다는 점에서 중요합니다. 또한 비동기 사용자 비동기 사용자가 여러 개 세션을 설정 한 경우 클라이언트가 에서 이러한 별도의 사용자가 동시에 이 실행되는 경우를 처리하도록 강제하지 않는 것이 중요합니다. 이러한 제한 사항으로 인해 일반적인 클라이언트에서 JMS를보다 쉽게 ​​사용할 수 있습니다. 더 복잡한 클라이언트는 다중 세션을 사용하여 원하는 동시성을 얻을 수 있습니다.