2017-05-02 1 views
1

단일 대기열을 수신하는 여러 MDB 리스너를 구현해야한다는 요구 사항이 있습니다. 대기열의로드가 증가함에 따라 하나의 리스너가 해당로드를 처리하기에 충분하지 않습니다. 우리가 이것을 달성하기 위해 할 수있는 최선의 방법을 알고 싶습니다.동일한 대기열에서 여러 MDB 리스너 읽기

a. 비슷한 MDB 클래스를 만들고이를 websphere 서버에 배포 할 수 있습니다. b. 구성을 사용하는 다른 방법은 없습니까?

청취자를 동적으로 구성하고 필요할 때 사용할 수있는 것처럼 올바른 방법을 제공해 주시겠습니까? 아니면이를 수행하는 데 편도 포인트 (a) 만 있습니까?

답변

0

중요한 점을 놓치 셨습니다. 클라이언트 요청을 처리하기 위해 하나 이상의 빈을 인스턴스화하는 컨테이너입니다. 엔터프라이즈 빈즈의 전 세계에는 확장 성이 핵심 요소입니다.

기본적으로 bean을 디자인하고 배치하는 것 외에는 다른 작업을 수행 할 필요가 없습니다. 컨테이너가 나머지 작업을 수행합니다.

0

@MessageDriven annotation을 사용하여 JEE 사양에 정의 된대로 MDB를 사용하는 경우 이러한 콩의 실제 인스턴스화 및 크기 조정을 관리하는 것은 서버 컨테이너에 달려 있습니다. 저는 Websphere에 익숙하지 않지만 대부분의 서버는 EJB 풀링 개념을 가지고 있습니다.이 풀은 대략 스레드 풀로 변환되므로 병렬 실행을 즉시 사용할 수 있습니다. 이렇게하면 서버에는 대기열에있는 메시지를 처리 ​​할 준비가 된 일련의 인스턴스가 있습니다. 각 bean 인스턴스는 onMessage 메소드를 실행하는 데 필요한 시간 동안 만 활성화되고, 그 후에는 정리되고 대기열로 리턴됩니다. 따라서 MDB 풀 크기는 20입니다. 대기열에서 20 개 이상의 메시지 대기가 있으면 서버는 사용 가능한 모든 인스턴스를 사용하고 동시에 20 개의 메시지를 처리합니다.
예를 들어 Wildfly/JBoss에서는 EJB 하위 시스템과 해당 풀 설정을 사용하여 EJB 풀을 관리합니다.

<subsystem xmlns="urn:jboss:domain:ejb3:4.0"> 
    <!--omitted for brevity... --> 
    <mdb> 
     <resource-adapter-ref resource-adapter-name="${ejb.resource-adapter-name:activemq-ra.rar}"/> 
     <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/> 
    </mdb> 
    <pools> 
     <bean-instance-pools> 
      <strict-max-pool name="mdb-strict-max-pool" derive-size="from-cpu-count" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> 
     </bean-instance-pools> 
    </pools> 
    <!--omitted for brevity... --> 

여기에 우리는 메시지 구동 빈은 우리의 시스템의 CPU 수에서 크기를 파생 mdb-strict-max-pool라는 이름의 풀을 사용한다 지정합니다. 절대 값을 지정할 수도 있습니다 (예 : max-pool-size="20"

이 모든 것은 단일 서버 인스턴스에서 대기열을 실행하는 경우에만 관련이 있습니다. 메시지 집약적 인 애플리케이션을 실제로 수행하고 있다면, 전용 메시지 브로커 및 다중 처리 인스턴스와 함께 분산 메시징이 필요할 가능성이 있습니다. 많은 서버가 이러한 시나리오 (예 : Wildfly ActiveMQ 클러스터)를 지원하지만 실제로 다른 토론을위한 주제입니다.

자세한 내용은 MDB tutorial 및 서버 설명서를 참조하십시오.
해피 해킹.

관련 문제