@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 및 서버 설명서를 참조하십시오.
해피 해킹.