2014-12-11 3 views
-1

내 시스템에는 블로그를 작성하는 사용자가 많습니다. 다른 사용자를 구독해야합니다. 중앙 집중식 시스템이 없습니다 (스윙 애플리케이션).많은 대기열에 대해 하나의 소비자

JMS를 사용하고 있습니다.

사용자는 한 명의 사용자, 두 명의 사용자 또는 100 명의 사용자를 추적 할 수 있습니다.

m_destination1 = m_session.createQueue("USER.DEVID"); 
m_consumer1 = m_session.createConsumer(m_destination1); 

m_destination2 = m_session.createQueue("USER.HARRY"); 
m_consumer2 = m_session.createConsumer(m_destination2); 

알 수없는 번호에 대해 위 코드 행을 작성하는 일반적인 방법이 있습니까? 사용자 중 하나의 소비자가 많은 사용자로부터 메시지를받을 수있는 것처럼.

와일드 카드가 작동하지 않습니다.

답변

1

사용할 수있는 가장 좋은 방법은 ActiveMQ를의 Mirrored Queue 특징은, 당신은 대기열이 기본적으로되어 않습니다, 그것은 모든 메시지가 전송 전달 미러링 여기에서 문서

  • http://activemq.apache.org/mirrored-queues.html
    • 를 읽을 수 있습니다 대기열을 비슷한 이름의 주제에 추가하면이 주제를 여러 소비자가 등록 할 수 있습니다.

      미러링 된 대기열을 사용하는 경우 소비자가 다른 주제를 구독해야합니다.

      당신의 디자인은 point-to-point 아키텍처 (즉, 큐)가 아닌 publish-subscribe (topic) 도메인을 요구합니다. 이미 다른 사람들이 블로그를 작성하기위한 큐를 생성하는 아키텍처를 사용하면 그 체계는 요구되지 않을 것이나 당신의 필요 조건은 음식을 장만하게 될 것입니다.

      2 소비자가 대기열에서 듣는 경우 대기열에서 병렬로 메시지를 가져옵니다. 즉 대기열에 2 개의 메시지가있는 경우 두 소비자가 각각 1 개의 메시지를 독립적으로 처리합니다. 필요.

      희망이 도움이됩니다. 행운을 빈다!

    +0

    무엇을 찾고 계셨습니까? – Vihar

    +0

    미러링 된 큐는 OP가 다른 사용자를 명시 적으로 지정하지 않아도된다는 목표를 달성하는 데 어떻게 도움이됩니까? – Tim

    +0

    다른 사용자는 의심의 여지없이 만들어야하지만 문제는 2 명의 사용자가 하나의 대기열에서 수신 대기하는 방법을 묻는 것입니다. 그리고 블로그는 모든 사용자가 대기열 기반으로는 불가능한 복사본을 필요로합니다. 접근 방식을 사용하면 미러링 된 대기열은 내부적으로 가능하면이를 사용하여 주제를 사용하며 인터페이스로 대기열을 사용하므로 OP가 가진 기존 아키텍처를 변경하지 않아도되고 요구 사항을 충족 할 수 있습니다. – Vihar

    1

    @ Vihar의 대답은 주제를 사용하여 게시 - 가입 패러다임을 사용해야 여러 소비자가 새로운 블로그 게시물을 통보받을 수 있다는 것입니다. 주된 어려움은 저자 당 한 개의 대상이 있고 메시지를 소비하려는 사용자는 각자 개별적으로 구독해야한다는 것입니다.

    대신, 모든 새 게시물 메시지를 단일 주제로 게시하십시오 (NewPostNotificationTopic이라고 부름). 그런 다음 클라이언트는 모든 메시지를 구독 할 수 있지만 관심있는 작성자 목록에 대해 즉시 확인하고 자신이 따르지 않는 작성자에 대한 알림 처리를 즉시 중단 할 수 있습니다. (이로 인해 필터링은 ActiveMQ 네트워크가 아닌 메시지 처리기에 배치됩니다.) 이는 각 메시지가 각 클라이언트로 전달된다는 것을 의미하지만 메시지가 작고 네트워크가 빠르며 사용자가 일반적으로 네트워크, 이것이 실행 가능한 솔루션 일 수 있습니다. 그러나 모든 메시지를 모든 클라이언트에게 보내는 네트워크 대역폭을 확보 할 수 없거나 소비자가 오랜 시간 동안 오프라인 상태가되어 온라인으로 돌아올 때까지 번 메시지를 보관할 여유가 없다면 , 이것은 당신을 위해 작동하지 않을 수 있습니다.

    또는 동일한 주제에 모든 메시지를 게시하고 작성자의 ID를 메시지의 헤더로 설정하고 메시지 선택기를 사용하여 주어진 작성자 ID와 일치하는 메시지 만 제공하도록 ActiveMQ에 알리십시오.이것은 더 효율적 일 것입니다. 그러나 OR을 포함하는 선택기를 사용한 단일 구독 또는 작성자 당 하나의 구독으로 관심있는 작성자를 명시 적으로 ActiveMQ에 알릴 필요가 있습니다. 후자는 더 깨끗하지만 독자 당 한 구독자 당 하나의 구독 문제로 돌아옵니다. 전자는 구독이 단 한 번이지만 구독자를 추가하거나 제거 할 때마다 업데이트해야하며 구독을 제거하고 다른 구독을 추가하는 고유 한 경쟁 조건을 처리해야합니다. 내가 제안한 첫 번째 솔루션 (ActiveMQ 구독 대신 메시지 처리기에서 필터링을 수행)으로 갈 것입니다. 그렇지 않으면 ORed 셀렉터로 단일 구독을하고 뭔가가 변경 될 때마다 구독을 다시해야하는 것보다는 독자 당 하나의 구독자를 사용하는 것이 좋습니다.

    관련 문제