제3장 인바운드 관리

내용 목차

3.1. Work Manager 관리
3.1.1. 기본 개념
3.1.2. Work Manager 설정
3.2. Message Inflow

본 장에서는 EIS에서 애플리케이션으로 향하는 인바운드 커뮤니케이션에서 JEUS의 역할과 기능에 대해 설명한다. 주로 Work Manager, Message Driven Beans(MDB)와 리소스 어댑터 간의 연동에 관련하여 설명한다.

3.1. Work Manager 관리

본 절에서는 Work Manager의 기본 개념과 설정 방법에 대해서 설명한다.

3.1.1. 기본 개념

WAS에서 백그라운드로 어떤 일을 실행시키거나 다른 애플리케이션으로 정보를 넘기고 싶을 때 리소스 어댑터에서 Java Thread를 생성하게 될 것이다. 그러나 리소스 어댑터 내에서 직접 Java Thread를 생성하는 것은 WAS 입장에서 그다지 반길만한 상황이 아니다. 그렇기 때문에 리소스 어댑터에서 어떤 일을 실행시키고 싶으면 그것을 WAS로 넘겨주고, 직접적인 Thread 관리는 WAS가 대신해 주겠다는 것이 Work Manager의 기본 의도이다. 이때 일은 javax.resource.spi.work.Work 인터페이스를 구현한 인스턴스로 나타낸다.

JEUS에서는 Thread Pool을 기반으로 Work Manager를 제공한다. Thread Pool은 리소스 어댑터가 Work Manager를 실제로 사용할 때 생성해 주기 때문에 일단 javax.resource.spi.BootstrapContext를 통해서 항상 유효한 Work Manager 인스턴스를 넘겨준다.

JEUS의 Work Manager 설정은 Thread Pool 스타일의 설정으로 되어 있다. 만약 아무런 설정을 하지 않을 경우에는 jeus-connector-dd.xsd 스키마에 정의된 기본값으로 생성된다.

참고

Work Manager 및 Work에 대한 자세한 사항은 JCA 표준 1.6을 기준으로 "10. Work Management"를 참고한다.

JDK Thread Pool은 최솟값(JDK에서는 core size라고 함)만큼 Thread를 늘린 이후에는 Thread를 무조건 큐에 쌓는다. 큐가 가득 차면 Thread를 최댓값까지 늘리는 방식이다.

JEUS의 Thread Pool은 JDK에서 제공하는 Thread Pool(java.util.concurrent.ThreadPoolExecutor)의 동작과 거의 유사하다. 그러나 JEUS의 Thread Pool은 Thread를 늘리는 조건을 JDK 방식보다 좀더 완화해서 일의 양에 따라 Thread를 적절히 늘리는 방식을 취하고 있다. 따라서 리소스 어댑터가 Work Manager를 빈번하게 사용하는 경우에는 최솟값, 최댓값 외에도 <keep-alive-time>과 <queue-size>를 적절하게 조절해야 한다.

3.1.2. Work Manager 설정

Work Manager는 내부적으로 Thread Pool을 사용하기 때문에 결국 Thread Pool 설정과 유사하다. Work Manager 설정은 리소스 어댑터에 포함되는 jeus-connector-dd.xml의 <worker-pool>에 한다.

다음은 Work Manager의 설정 예제이다.

[예 3.1] Work Manager 설정 : <<jeus-connector-dd.xml>>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jeus-connector-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <worker-pool>
        <min>0</min>
        <max>5</max>
        <keep-alive-time>60000</keep-alive-time>
        <shutdown-timeout>-1</shutdown-timeout>
    </worker-pool>
</jeus-connector-dd>


다음은 <worker-pool>의 태그에 대한 설명이다.

태그설명
<min>Work Manager가 관리하는 Thread 수의 최솟값이다. (기본값: 0)
<max>Work Manager가 관리하는 Thread 수의 최댓값이다. (기본값: 5)
<keep-alive-time>

최솟값 이외의 Thread의 경우 설정된 시간 동안 사용되지 않는다면 자동적으로 Thread Pool에서 제거된다. (기본값: 1분)

<pooled-timeout>을 대체하는 설정이다.

<queue-size>Thread Pool에서 필요로 하는 큐의 크기를 지정한다. (기본값: 4096)
<pre-allocation>Work Manager가 초기화될 때 <min> 값에 설정된 수의 Thread를 미리 만들어 놓는다. (기본값: true)
<shutdown-timeout>리소스 어댑터를 undeploy하면서 Work Manager가 종료될 때 여기에 설정된 시간 동안 기다린 후 종료된다. 기다리는 동안 새로운 요청은 받지 않는다. 즉, Graceful Shutdown을 지원한다. (기본값 : -1, 기다리지 않고 종료한다)

참고

jeus-connector-dd.xml를 RAR에 포함시키는 방법은 “제4장 리소스 어댑터”를 참고한다.

3.2. Message Inflow

JCA 표준에 따라 리소스 어댑터에서 JEUS에 deploy된 애플리케이션으로 인바운드 커뮤니케이션을 하기 위해서는 MDB를 구현해야 한다. 그리고 MDB을 통해서 다른 EJB 컴포넌트를 호출하도록 권장하고 있다.

[그림 1.2]에 따르면 WAS에서 애플리케이션으로 가는 흐름에서 MDB가 1차적인 관문 역할을 한다.

본 절에서는 JEUS에서 MDB와 리소스 어댑터를 연동하는 방법에 대해서 설명한다.

참고

Message Inflow의 자세한 사항은 JCA 표준 1.6을 기준으로 "13. Message Inflow" 또는 이에 관련된 서적을 참고한다.

다음은 MDB 예제이다.

@MessageDriven(
    activationConfig =
    {
    @ActivationConfigProperty(propertyName = "destinationType", 
       propertyValue = "javax.jms.Queue")
    , @ActivationConfigProperty(propertyName = "DestinationProperties", 
       propertyValue = "imqDestinationName=Queue")
    , @ActivationConfigProperty(propertyName = "ProviderIntegrationMode", 
      propertyValue = "jndi")
    , @ActivationConfigProperty(propertyName = "ConnectionFactoryJndiName", 
      propertyValue = "XAConnectionFactory")
    , @ActivationConfigProperty(propertyName = "DestinationJndiName", 
      propertyValue = "jms/QUEUE1")
    }
)

public class TestMsgBean implements javax.jms.MessageListener {
    ...

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void onMessage(Message message) {
       ...
    }
}

EJB 3.0부터는 ejb-jar.xml 대신 Annotation으로 설정이 가능하다. MDB에는 @ActivationConfigProperty를 이용해서 리소스 어댑터가 요구하는 프로퍼티들을 반드시 설정해야 하며, 이에 관해서는 리소스 어댑터가 제공하는 매뉴얼 등을 참조한다.

MDB와 연동할 리소스 어댑터를 jeus-ejb-dd.xml의 <mdb-resource-adapter-name>을 설정해야 한다.

[예 3.2] MDB 연동 리소스 설정 : <<jeus-ejb-dd.xml>>

<jeus-ejb-dd>
    . . .
    <beanlist>
        <jeus-bean>
           <ejb-name>TestMsgBean</ejb-name>
           <connection-factory-name>QueueConnectionFactory</connection-factory-name>
           <destination>jms/QUEUE1</destination>
           <mdb-resource-adapter-name>app#ra</mdb-resource-adapter-name>
            ...
        </jeus-bean>
    . . .


태그설명
<mdb-resource-adapter-name>

연동할 리소스 어댑터를 지정한다. 이때 리소스 어댑터가 Standalone 모듈인 경우와 EAR에 포함되어 있는 모듈인 경우에 따라 리소스 어댑터 이름이 달라진다.

  • Standalone 모듈인 경우: 해당 모듈의 이름

  • EAR에 속한 모듈인 경우: EAR 이름 + '#' + 해당 모듈의 이름

위의 예제는 리소스 어댑터가 EAR에 속한 모듈인 경우이고, EAR의 이름이 'app', 리소스 어댑터 모듈의 이름이 'ra'이다.

주의

MDB를 deploy할 때 리소스 어댑터가 먼저 deploy되어 있어야 한다는 점에 주의한다.