제9장 Message Driven Bean(MDB)

내용 목차

9.1. 개요
9.2. MDB 설정
9.2.1. 기본 환경설정
9.2.2. JMS 설정
9.2.3. JNDI SPI 환경설정

본 장에서는 EJB 엔진에서 Message Driven Bean(이하 MDB)를 사용할 때 유의해야 할 사항들을 설명한다.

9.1. 개요

EJB 엔진은 MDB Instance들을 동시에 여러 개 실행시킬 수 있으며, 또한 message stream을 처리할 수도 있다. EJB 엔진은 MDB 클래스에 도착하는 메시지들의 순서를 보장하지 않으므로 받은 순서대로 메시지를 전달하지 못하고 임의로 메시지를 전달한다.

MDB도 처리 순서를 보장하지 않는다. 예를 들어 예약을 하는 메시지가 도착하기 전에 예약을 취소하는 메시지가 먼저 올 수 있기 때문에 설계할 때 처리 순서에 대해 고려해야 한다.

이런 동시 처리는 Bean Pool이 MDB에서 Instance를 가져와서 Request에 할당함으로써 처리된다. 이는 Stateless Session Bean의 Thread Ticket Pool(TTP)의 동작법과 거의 동일하다. 따라서 MDB에서는 <thread-max> 값이 아닌 <pool-max> 값을 사용해야 한다. 이에 대해서는 “제7장 Session Bean”을 참조한다.

9.2. MDB 설정

EJB 엔진이 MDB를 실행하기 위해서는 약간의 설정이 필요하다. MDB는 고유의 설정 외에 JEUS의 다른 EJB와 공통되는 설정도 가지고 있다.

본 절에서는 다음 항목을 간략하게 설명한다.

  • JEUS EJB DD의 기본 MDB 설정(“제4장 EJB의 공통 특성”에서 설명한 설정들의 하위 항목)

  • JEUS EJB DD 파일에 설정되어 있는 JEUS MDB의 JMS 전용 설정

참고

MDB 설정은 MDB를 잘 알고 있는 이들에게는 별도로 설명할 필요가 없다.

9.2.1. 기본 환경설정

MDB는 다른 EJB 종류와 유사한 기본 설정을 사용한다. 각 MDB에 설정할 수 있는 것들은 <ejb-name>, <run-as identity>, <security-interop> 등이 있다.

다음은 MDB의 기본 설정 예제이다.

[예 9.1] 기본 환경설정 : <<jeus-ejb-dd.xml>>

<jeus-ejb-dd>
        . . .
    <beanlist>
        . . .
        <jeus-bean>
            <ejb-name>order</ejb-name>
            <!--JMS settings goes here (see “9.2.2. JMS 설정” )-->
            <run-as-identity>
                . . .            
            </run-as-identity>
            <security-interop>
                . . .
            </security-interop>
            <env>
                . . .
            </env>
            <ejb-ref>
                . . .
            </ejb-ref>
            <res-ref>
                . . .
            </res-ref>
            <res-env-ref>
                . . .
            </res-env-ref>
            <!-- No clustering of MDB --> 
        </jeus-bean>
        . . .
    </beanlist>
       . . .
</jeus-ejb-dd> 
 


9.2.2. JMS 설정

MDB가 처리하는 메시지에 따라 성격이 달라진다. JMS 메시지를 처리하는 경우에는 JMS Connection Factory의 export name이 필요하고 Connector 메시지를 처리하는 경우에는 리소스 어댑터가 필요하다.

다음은 MDB 클래스의 Annotation으로 설정한 것과 그에 대응되는 XML 문서의 일부이다.

[예 9.2] JMS 설정 : <<MyMDB.class>>

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(propertyName="destinationType", 
                                  propertyValue="javax.jms.Queue"),
        @ActivationConfigProperty(propertyName="acknowlegeMode",
                                  propertyValue="Auto-acknowledge")
    },
    mappedName = "jms/QUEUE1"
)
public class MyMDB implements MessageListener {

...

}


[예 9.3] JMS 설정 : <<jeus-ejb-dd.xml>>

<jeus-ejb-dd>
        . . .
    <beanlist>
        . . .
        <jeus-bean>
            . . .
            <ejb-name>MyMDB</ejb-name>
            <connection-factory-name>
                QueueConnectionFactory
            </connection-factory-name>
           <destination>jms/QUEUE1</destination>
            <max-message>15</max-message>
            <activation-config>
                <activation-config-property>
                    <activation-config-property-name>
                         destinationType
                    </activation-config-property-name>
                    <activation-config-property-value>
                         javax.jms.Queue
                    </activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>
                        acknowlegeMode
                    </activation-config-property-name>
                    <activation-config-property-value>
                        Auto-acknowledge
                    </activation-config-property-value>
                </activation-config-property>
            </activation-config>
            . . .
        </jeus-bean>
             . . .
    </beanlist>
      . . .
</jeus-ejb-dd>


다음은 설정 태그에 대한 설명이다.

  • <connection-factory-name>

    • JMS Connection Factory가 사용할 JNDI export name을 설정한다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml/<jeus-bean>/<connection-factory-name>

      2. jeus-ejb-dd.xml/<jeus-bean>/<activation-config> property name : jeus.connectionFactoryName

      3. @ActivationConfigProperty property name : jeus.connectionFactoryName

  • <mdb-resource-adapter>

    • JEUS Connector를 통해 메시징 시스템과 연결될 경우 사용하는 리소스 어댑터를 설정한다. 해당 리소스 어댑터의 jeus-connector-dd.xml에 지정되어 있는 모듈의 ID를 설정하여 사용한다.

  • <destination>

    • JMS Destination의 JNDI 이름을 설정한다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml/<jeus-bean>/<destination>

      2. ejb-jar.xml의 <message-driven>/<mapped-name>

      3. @MessageDriven의 mappedName

      4. ejb-jar.xml의 <message-driven>/<message-destination-link>

  • <jndi-spi>

    • MDB가 기본값(jeus.jndi.JNSContextFactory)이 아닌 다른 JNDI 이름 서비스에 등록되어 있는 JMS 서비스를 사용할 때 즉, JEUS MDB를 IBM MQ나 SONIC MQ같은 JEUS JMS 서비스 이외의 것과 연결할 때 사용한다.

  • <max-messages>

    • 여러 개의 JMS 세션을 등록해서 처리할 경우 한 세션에 메시지를 할당하는 최대 개수를 지정할 때 사용한다.

    • 큐에 쌓인 메시지 수가 설정된 값보다 적으면 하나의 세션이 계속 처리하며 쌓인 메시지가 이 값을 넘어가면 그때 다른 세션을 사용한다. 즉, 이 값이 10일 경우 메시지 수가 10개를 넘을 때까지는 하나의 세션만이 메시지를 처리한다. 이는 load를 줄이기 위한 것이며 자세한 것은 JMS 스펙을 참고한다.

  • <activation-config>

    • JMS나 리소스 어댑터를 설정할 activation config로 ejb-jar.xml의 activation config를 override하는 경우에 사용한다.

    • JMS MDB의 경우에는 acknowledgeMode, messageSelector, destinationType, subscriptionDurability의 기본적으로 인식된다. 추가적으로 위에서 말한 jeus.connectionFactoryName와 jeus.clientId, jeus.subscriptionName을 사용할 수 있다. jeus.clientId와 jeus.subscriptionName은 Topic의 Durable Subscription을 위해 제공되고 만약 이 값들이 설정되지 않으면 "모듈 이름"/"Bean 이름"으로 설정된다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml의 <activation-config>

      2. ejb-jar.xml의 <activation-config>

      3. @ActivationConfig

  • <ack-mode>

    • JMS 세션의 Acknowlege 모드를 설정한다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml/<jeus-bean>/<ack-mode>

      2. jeus-ejb-dd.xml/<jeus-bean>/<activation-config> property name : acknowlegeMode

      3. ejb-jar.xml/<message-driven-bean>/<activation-config> property name : acknowlegeMode

      4. ejb-jar.xml/<message-driven-bean>/<acknowledge-mode>

      5. @ActivationConfigProperty property name : acknowledgeMode

  • <durable>

    • JMS의 Durable Subscriber를 설정한다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml/<jeus-bean>/<durable>

      2. jeus-ejb-dd.xml/<jeus-bean>/<activation-config> property name : subscriptionDurablity

      3. ejb-jar.xml/<message-driven-bean>/<activation-config> property name : subscriptionDurablity

      4. ejb-jar.xml/<message-driven-bean>/<subscription-durability>

      5. @ActivationConfigProperty property name : subscriptionDurablity

  • <msg-selector>

    • JMS의 message selector를 설정한다.

    • 이 설정은 여러 곳에서 설정 가능하고 우선순위는 다음과 같다.

      1. jeus-ejb-dd.xml/<jeus-bean>/<msg-seletor>

      2. jeus-ejb-dd.xml/<jeus-bean>/<activation-config> property name : messageSelector

      3. ejb-jar.xml/<message-driven-bean>/<activation-config> property name : messageSelector

      4. ejb-jar.xml/<message-driven-bean>/<message-selector>

      5. @ActivationConfigProperty property name : messageSelector

참고

위의 설정에 대한 자세한 내용은 "JEUS MQ 안내서", "JEUS JCA 안내서", "JMS 표준", "EJB 표준"을 참고한다.

9.2.3. JNDI SPI 환경설정

기본적으로 JEUS MDB는 JEUS Naming Service로 JMS의 connection을 Lookup해서 사용한다.

만약 다른 JMS 서비스(IBM MQ나 SONIC MQ)를 이용하는 경우 다른 서비스에서 connection을 얻어야 한다. 이런 경우는 JMS 서비스를 포함한 외부 Naming Service를 사용하는 MDB를 설정할 수 있다. MDB가 JMS 서비스를 찾기 위해 각각의 MDB에 <jndi-spi>를 설정한다.

다음은 JNDI SPI 환경설정에 대한 예제이다.

[예 9.4] JNDI SPI 환경설정: <<jeus-ejb-dd.xml>>

<jeus-ejb-dd>
        . . .
    <beanlist>
        . . .
         <jeus-bean>
            . . .
            <jndi-spi>
                <mq-vendor>SONICMQ</mq-vendor>
                <initial-context-factory>
                    acme.jndi.ACMEContextFactory
                </initial-context-factory>
                <provider-url>
                    protocol://localhost:2345
                </provider-url>
            </jndi-spi>
            . . .
        </jeus-bean>
             . . .
    </beanlist>
      . . .
</jeus-ejb-dd>

다음은 <jndi-spi> 하위의 설정 태그에 대한 설명이다.

태그설명
<mq-vendor>MDB가 connection을 맺을 MQ/JMS의 벤더의 이름이다(JNDI naming 서비스를 통해 설정). 'IBMMQ'와 'SONICMQ'가 공식적인 지원 벤더이다.
<initial-context-factory>Naming Server를 위한 JNDI InitialContext Factory 클래스의 이름을 사용해서 JMS 서비스에 연결된다.
<provider-url>요청에 의해서 Naming Service에 접속할 때 사용하는 URL이다.