4.2. Message-Driven Beans Controlled Delivery

JBoss EAP는 특정 MDB에서 메시지의 활성 수신을 제어하는 세 가지 특성을 제공합니다.

4.2.1. 제공(활성)

MDB(Message-driven Bean)의 전달 활성 구성은 MDB에서 메시지를 수신하고 있는지 여부를 나타냅니다. MDB에서 메시지를 수신하지 않으면 토픽 또는 큐 규칙에 따라 메시지가 대기열 또는 항목에 저장됩니다.

XML 또는 주석을 사용하여 delivery-group활성 특성을 구성할 수 있으며 관리 CLI를 사용하여 배포 후에 해당 값을 변경할 수 있습니다. 기본적으로 활성 특성이 활성화되고 메시지 전송은 MDB가 배포되는 즉시 수행됩니다.

jboss-ejb3.xml 파일에서 활성 상태로 전달 구성

jboss-ejb3.xml 파일에서 active 값을 false 로 설정하여 MDB가 배포되는 즉시 메시지를 받지 않을 것임을 나타냅니다.

<?xml version="1.1" encoding="UTF-8"?>
<jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:d="urn:delivery-active:1.1"
    xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    version="3.1"
    impl-version="2.0">
    <assembly-descriptor>
        <d:delivery>
            <ejb-name>HelloWorldQueueMDB</ejb-name>
            <d:active>false</d:active>
        </d:delivery>
    </assembly-descriptor>
</jboss:ejb-jar>

애플리케이션의 모든 MDB에 활성 값을 적용하려면 ejb-name 대신 와일드카드 * 를 사용할 수 있습니다.

주석을 사용하여 활성 배달 구성

org.jboss.ejb3.annotation.DeliveryActive 주석을 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

@MessageDriven(name = "HelloWorldMDB", activationConfig = {
 @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
 @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/HELLOWORLDMDBQueue"),
 @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@DeliveryActive(false)

public class HelloWorldMDB implements MessageListener {
    public void onMessage(Message rcvMessage) {
      // ...
    }
}

Maven을 사용하여 프로젝트를 빌드하는 경우 프로젝트의 pom.xml 파일에 다음 종속성을 추가해야 합니다.

<dependency>
    <groupId>org.jboss.ejb3</groupId>
    <artifactId>jboss-ejb3-ext-api</artifactId>
    <version>2.2.0.Final</version>
</dependency>
관리 CLI를 사용하여 활성 상태로 배달 구성

관리 CLI를 사용하여 배포 후에 delivery-group활성 특성을 구성할 수 있습니다. 이러한 관리 작업은 활성 특성의 값을 동적으로 변경하여 MDB에 대한 전달을 활성화하거나 비활성화합니다. 서버를 다시 시작하면 제공 활성 값을 변경하는 이 방법이 유지되지 않습니다. 런타임에 관리할 인스턴스에 연결한 다음 배달을 관리할 MDB 경로를 입력합니다. 예를 들면 다음과 같습니다.

  • 관리할 인스턴스로 이동합니다.

    cd deployment=helloworld-mdb.war/subsystem=ejb3/message-driven-bean=HelloWorldQueueMDB
  • MDB로의 배달을 중지하려면 다음을 수행합니다.

    :stop-delivery
  • MDB에 대한 배달을 시작하려면 다음을 수행합니다.

    :start-delivery
MDB 제공 활성 상태 보기

관리 콘솔을 사용하여 모든 MDB의 현재 제공 활성 상태를 볼 수 있습니다.

  1. Runtime(런타임 ) 탭을 선택하고 적절한 서버를 선택합니다.
  2. EJB 를 클릭하고 하위 리소스(예: HelloWorldQueueMDB) 를 선택합니다.

결과

Delivery Active: true 또는 Delivery Active: false 로 상태가 표시됩니다.

4.2.2. 제공 그룹

제공 그룹은 MDB 그룹의 제공-활성 상태를 관리하는 방법을 제공합니다. MDB는 하나 이상의 배달 그룹에 속할 수 있습니다. 메시지 전송은 MDB가 속한 모든 배달 그룹이 활성화된 경우에만 활성화됩니다. 클러스터형 Singleton MDB의 경우 MDB와 연결된 모든 배달 그룹이 활성화된 경우에만 메시지 배달이 클러스터의 Singleton 노드에서만 활성화됩니다.

XML 구성 또는 관리 CLI를 사용하여 ejb3 하위 시스템에 전달 그룹을 추가할 수 있습니다.

jboss-ejb3.xml 파일에서 전달 그룹 구성
<delivery>
  <ejb-name>MdbName<ejb-name>
  <delivery-group>passive</delivery-group>
</delivery>

서버 측에서 실행 그룹은 활성 특성을 true 로 설정하거나 아래 예제와 같이 활성 특성을 false 로 설정하여 비활성화할 수 있습니다.

<delivery-groups>
  <delivery-group name="group" active="true"/>
</delivery-groups>
관리 CLI를 사용하여 배달 그룹 구성

delivery-group 의 상태는 관리 CLI를 사용하여 업데이트할 수 있습니다. 예를 들면 다음과 같습니다.

/subsystem=ejb3/mdb-delivery-group=group:add
/subsystem=ejb3/mdb-delivery-group=group:remove
/subsystem=ejb3/mdb-delivery-group=group:write-attribute(name=active,value=true)

jboss-ejb3.xml 파일에서 배달을 활성화하거나 주석을 사용하면 서버 재시작 시 지속됩니다. 그러나 관리 CLI를 사용하여 제공을 중지하거나 시작하면 서버 재시작 시 유지되지 않습니다.

주석을 사용하여 여러 배달 그룹 구성

그룹에 속하는 각 MDB 클래스에서 org.jboss.ejb3.annotation.DeliveryGroup 주석을 사용할 수 있습니다.

@MessageDriven(name = "HelloWorldQueueMDB", activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/HELLOWORLDMDBQueue"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
@DeliveryGroup("delivery-group-1")
@DeliveryGroup("delivery-group-2")
public class HelloWorldQueueMDB implements MessageListener {
...
}

4.2.3. 클러스터형 Singleton MDB

MDB를 클러스터된 Singleton으로 식별하고 클러스터에 배포하면 하나의 노드만 활성화됩니다. 이 노드는 메시지를 직렬로 사용할 수 있습니다. 서버 노드가 실패하면 클러스터된 Singleton MDB의 활성 노드가 메시지 사용을 시작합니다.

MDB를 클러스터된 Singleton으로 식별

다음 절차 중 하나를 사용하여 MDB를 클러스터된 Singleton으로 식별할 수 있습니다.

  • 아래 예와 같이 clustered-singleton XML 요소를 사용합니다.

    <?xml version="1.1" encoding="UTF-8"?>
    <jboss:ejb-jar xmlns:jboss="http://www.jboss.com/xml/ns/javaee"
                   xmlns="http://java.sun.com/xml/ns/javaee"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:c="urn:clustering:1.1"
                   xmlns:d="urn:delivery-active:1.2"
                   xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
                   version="3.1"
                   impl-version="2.0">
        <assembly-descriptor>
            <c:clustering>
                <ejb-name>HelloWorldQueueMDB</ejb-name>
                <c:clustered-singleton>true</c:clustered-singleton>
            </c:clustering>
             <d:delivery>
                    <ejb-name>*</ejb-name>
                    <d:group>delivery-group-1</d:group>
                    <d:group>delivery-group-2</d:group>
            </d:delivery>
        </assembly-descriptor>
    </jboss:ejb-jar>
  • MDB 클래스에서 @org.jboss.ejb3.annotation.ClusteredSingleton을 사용합니다. 이 절차에는 서버에 추가 구성이 필요하지 않습니다. 클러스터형 환경에서 서비스를 실행해야 합니다.
참고

클러스터의 어떤 노드 Singleton 마스터가 되도록 선택되었는지 모르는 경우 클러스터의 모든 노드에서 특히 전체 클러스터에서 제공 그룹을 활성화해야 합니다. 서버에서 Singleton 마스터 로 노드를 선택하고 해당 노드에 필요한 delivery-group 이 활성화되지 않은 경우 클러스터의 노드가 메시지를 받지 않습니다.

JBoss EAP와 함께 제공되는 messaging-clustering-singleton 빠른 시작은 통합된 Apache ActiveMQ Artemis와의 클러스터링 사용을 보여줍니다. helloworld-mdb 빠른 시작과 동일한 소스 코드를 사용하며 클러스터형 Singleton으로 실행하는 구성에서만 차이가 있습니다. 이 빠른 시작에는 두 개의 Jakarta Messaging 리소스가 포함되어 있습니다.

  • Java 네이밍 및 디렉터리 인터페이스에 java:/queue/HELLO WORLDMDBQueue 바인딩된 HELLO WORLDMDBQueue라는 큐
  • Java Naming 및 Directory Interface에서 java:/topic/HELLOWORLDMDBTopic으로 바인딩된 HELLO WORLDMDBTopic이라는 항목

두 파일 모두 jboss-ejb3.xml 파일에 지정된 singleton 구성이 포함되어 있습니다.

<c:clustering>
    <ejb-name>*</ejb-name>
    <c:clustered-singleton>true</c:clustered-singleton>
</c:clustering>

<ejb-name> 요소의 와일드카드 별표 * 는 애플리케이션에 포함된 모든 MDB가 클러스터형 Singleton임을 나타냅니다. 결과적으로 클러스터에서 하나의 노드만 특정 시간에 이러한 MDB를 활성화하게 됩니다. 이 활성 노드를 종료하면 클러스터의 다른 노드가 MDB가 있는 활성 노드가 됩니다. 그러면 Singleton 공급자가 됩니다.

jboss-ejb3.xml 파일에서 delivery 그룹에 대한 구성도 찾을 수 있습니다.

<d:delivery>
    <ejb-name>HelloWorldTopicMDB</ejb-name>
    <d:group>my-mdb-delivery-group</d:group>
</d:delivery>

이 경우 MDB 중 HelloWorldTopicMDB 만 배달 그룹과 연결됩니다. MDB에서 사용하는 모든 배달 그룹은 ejb3 하위 시스템 구성에서 구성해야 합니다. 배달 그룹은 활성화 또는 비활성화할 수 있습니다. 클러스터 노드에서 배달 그룹을 비활성화하면 해당 배달 그룹에 속하는 모든 MDB가 해당 클러스터 노드에서 비활성화됩니다. 클러스터되지 않은 환경에서 배달 그룹을 사용하는 경우 배달 그룹이 활성화될 때마다 MDB가 활성화됩니다.

전송 그룹을 Singleton 프로바이더와 함께 사용하는 경우 해당 노드에 배달 그룹이 활성화된 경우에만 Singleton 공급자 노드에서 MDB를 활성화할 수 있습니다. 그렇지 않으면 해당 노드에서 MDB가 비활성화되고 클러스터의 다른 모든 노드가 비활성화됩니다.

메시징 클러스터링 서버를 구성하고 코드 예제를 검토하는 방법에 대한 자세한 지침은 이 빠른 시작에 포함된 README.html 파일을 참조하십시오.

JBoss EAP 빠른 시작을 다운로드하고 사용하는 방법에 대한 자세한 내용은 JBoss EAP Getting Started Guide 의 빠른 시작 예제 사용 섹션을 참조하십시오.