제11장 domain.xml의 EJB 엔진 설정

여기에서 JEUS의 EJB 엔진에 설정에 관한 설명을 찾을 수 있다.

11.1. 소개

레퍼런스는 다음 형식으로 구성되어 있다.

  1. XML Schema/XML 트리: XML 설정 파일의 모든 태그 리스트를 정리했다. 각 노드의 형식은 다음과 같다.

    1. 태그 레퍼런스로 빨리 찾아보기 위해서 각 태그마다 인덱스 번호( 예: (11) )를 붙여 놓았다. 태그 레퍼런스에서는 이 번호 순서로 설명한다.

    2. XML Schema에서 정의한 XML 태그명을 <tag name> 형식으로 표시한다.

    3. XML Schema에서 정의한 Cardinality를 표시한다. “?” = 0개나 1개의 element, “+” = 1개 이상의 element, “*” = 0개 이상의 element, (기호가 없음) = 정확히 1개의 element

    4. 몇몇 태그에는 “P” 문자를 붙여 놓았는데, 해당 태그는 성능에 관계되는 태그라는 것을 뜻한다. 이 태그는 설정을 튜닝할 때 사용된다.

  2. Element Reference: 트리에 있는 각 XML 태그를 설명한다.

    1. Dynamic: 동적 설정 반영 가능

    2. Non-Dynamic: 동적 설정 반영 불가능, Dynamic이 설정되지 않은 항목들이 보통 이에 해당 하나 특별히 설명이 있는 경우 이 항목이 표시된다.

    3. Description: 태그에 대한 간단한 설명.

    4. Value Description: 입력하는 값과 타입.

    5. Value Type: 값의 데이터 타입. (예: String)

    6. Value Type Description: 값의 데이터 타입에 대한 설명

    7. Default Value: 해당 XML을 사용하지 않았을 때 기본적으로 사용되는 값.

    8. Defined Value: 이미 정해져 있는 값.

    9. Example: 해당 XML 태그에 대한 예.

    10. Performance Recommendation: 성능 향상을 위해서 추천하는 값.

    11. Child Elements: 자신의 태그 안에 사용하는 태그.

11.2. XML Schema/XML 트리

11.3. Element Reference

(653) <domain> <servers> <server> <ejb-engine>
Description EJB 엔진은 J2EE EJB 애플리케이션이 작동하기 위한 환경을 제공한다. J2EE 스펙에서의 EJB 컨테이너에 대응하는 기능이다. 서버가 부팅될 때 실행되며, 하나의 서버에서는 하나의 EJB 엔진만 지원한다.
Value Type ejb-engineType
Child Elements

(654) resolution?

(655) use-dynamic-proxy-for-ejb2?

(656) enable-user-notify?

(657) invoke-http?

(660) active-management?

(674) timer-service?

(685) async-service?

(654) <domain> <servers> <server> <ejb-engine> <resolution>
Dynamic ActiveManager, PassivationTask를 고려하여 반영한다.
Description EJB 엔진의 상태를 체크하는 주기이다. Active Management를 설정했을 경우 Block된 스레드의 수를 체크하여 설정된 동작을 실행한다. 각 Bean이 <bean-pool>과 <connect-pool>을 사용하는 경우 Pool의 idle 개수를 줄이는 작업을 Resizing이라고 하는데 <resizing-period>가 지났는지 체크를 하고 Resizing을 수행한다. 또한 Stateful Session Bean이 클라이언트로부터 <passivation-timeout> 이상으로 요청이 없었는지 체크하고 필요하면 Passivation을 실행한다.
Value Description 밀리세컨드
Value Type nonNegativeLongType
Value Type Description 0 이상의 Long 값이다.
Default Value 300000
Example 100000

(655) <domain> <servers> <server> <ejb-engine> <use-dynamic-proxy-for-ejb2>
Non-Dynamic Stub이 다르게 생성되므로 동적 변경이 불가능하다.
Description (Since JEUS 6 Fix#7) JEUS 6 Fix#6 이후 버전부터는 EJB 2.x 스타일의 Bean에서 기존 RMI Stub 방식 대신 Dynamic Proxy 방식을 사용할 수 있다. Dynamic Proxy 방식이란, 클라이언트별로 직접 RMI Stub 클래스를 로딩해서 사용하는 대신에, 미리 생성되어 있는 RMI Stub에 대한 Dynamic Proxy(java.lang.reflect.Proxy)를 이용해서 메소드를 호출하는 방식이다. 이러한 Dynamic Proxy 방식을 이용해야만 Local Call Optimization(같은 JVM에서 호출되는 EJB Remote Call을 RMI를 통하지 않고 Local Call로 호출되도록 하여 성능을 향상 시켜주는 기능)을 사용할 수 있다. 만약, 이 EJB를 원격에서 호출하는 클라이언트가 있고, 그 클라이언트가 사용하는 JEUS 라이브러리 버전이 JEUS 6 Fix#6 보다 낮은 경우에는 호환성 문제가 발생하므로 이 옵션을 false로 설정한다. 이 옵션은 EJB 모듈별로 jeus-ejb-dd.xml의 <module-info><use-dynamic-proxy-for-ejb2>에 설정할 수 있으나, 현재 EJB 엔진의 모든 EJB 모듈에 대해서 EJB 2.x에 대해 Dynamic Proxy 방식을 사용하지 않고 원격 클라이언트와의 호환성을 유지하기 위해서, Use Dynamic Proxy For Ejb2를 false로 설정하여 EJB 모듈별 설정을 무시하도록 할 수 있다. 기본값 true로 EJB 2.x 스타일의 Bean에 대해서 Dynamic Proxy 방식을 사용하도록 한다.
Value Type boolean
Default Value true
Example true

(656) <domain> <servers> <server> <ejb-engine> <enable-user-notify>
Non-Dynamic 사용하는 곳이 별로 없고 User Log의 향후 모습에 따라 사라질 수 있다.
Description 특성이 활성화되면 EJB Exception은 서버의 User Logging에 정의된 User Log에 기록된다.
Value Type boolean
Default Value false
Example true

(657) <domain> <servers> <server> <ejb-engine> <invoke-http>
Non-Dynamic Stub이 다르게 생성되므로 동적으로 변경이 불가능하다.
Description 이 기능을 설정하면 클라이언트 측의 EJB Stub과 원격지의 RMI 실행 환경은 HTTP-RMI 요청(Request)으로 통신한다. 이것은 방화벽을 사이에 두고 EJB에 접근할 때 사용된다. HTTP 호출 모드를 사용할 때 클라이언트가 EJB Stub에서 메소드를 호출하면 HTTP-RMI 요청(Request)은 이것을 웹 컨테이너로 보낼 웹 서버로 발송된다. 그리고 이것은 RMI 핸들러 서블릿(jeus.rmi.http.ServletHandler)으로 보내지고 여기서 핸들러 서블릿은 요청(Request)으로부터 HTTP 헤더를 제거한 뒤 이것을 RMI 실행 환경으로 전송한다. 이 설정은 jeus.rmi.http.ServletHandler 서블릿이 사전에 JEUS 웹 컨테이너에 반드시 Deploy되어 있어야만 한다("JEUS Web Engine 안내서" 참고).
Value Type invoke-httpType
Performance Recommendation HTTP 호출 모드를 사용함으로써 약간의 성능 향상을 기대할 수 있다.
Child Elements

(658) url

(659) http-port?

(658) <domain> <servers> <server> <ejb-engine> <invoke-http> <url>
Description HTTP-RMI Stub에 의해 호출될 RMI 핸들러 서블릿(jeus.rmi.http.ServletHandler) 의 URI 경로가 반드시 설정되어야 한다. 이 URL은 프로토콜, 웹 서버 IP, 포트 번호를 제외하고 오직 서블릿 요청 경로만을 설정해야 한다. 프로토콜은 HTTP, RMI 실행 환경과 웹 서버는 같은 IP 주소를 가지고 있다고 가정한다(이것은 웹 서버와 웹 엔진은 반드시 HTTP-RMI 요청을 같은 머신에서 받는다는 것을 의미한다). 포트 번호는 다음에 설명할 HTTP Port에서 설정한다.
Value Description RMI 핸들러 서블릿을 명시한 서블릿 컨텍스트 경로를 설정한다.
Value Type token
Example /mycontext/RMIHandlerServlet

(659) <domain> <servers> <server> <ejb-engine> <invoke-http> <http-port>
Description HTTP-RMI 요청을 받고 처리할 웹 서버의 포트 번호를 설정한다. 해당 웹 서버 및 웹 엔진에서는 반드시 RMI 핸들러 서블릿이 Deploy되어 있고 이미 실행 중이어야만 한다.
Value Description HTTP-RMI Stub가 연결할 웹 서버의 포트 번호를 설정한다.
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 80

(660) <domain> <servers> <server> <ejb-engine> <active-management>
Description EJB 엔진을 모니터링하고 오류를 처리하며 그 결과를 e-mail을 통해 관리자에게 통지한다. [Performace Recommendation]: 일반적으로 사용자는 EJB 엔진의 Active Management 보다는 서블릿 엔진에 포함된 Web Connections 사용을 권장한다.
Value Type active-managementType
Child Elements

(661) max-blocked-thread?

(662) max-idle-time?

(663) email-notify?

(661) <domain> <servers> <server> <ejb-engine> <active-management> <max-blocked-thread>
Dynamic 동적 변경이 가능하다.
Description Block된 스레드의 최대 개수를 설정한다. 이 설정값보다 EJB에 Block된 스레드 개수가 많을 경우에 서버 재시작을 권고한다. 이 값이 작게 설정되어 있다면 서버재시작 권고 메시지가 너무 자주 출력되므로 주의가 필요하다.
Value Description 스레드 개수
Value Type off-intType
Value Type Description 기본적으로 Non Negative Int 타입이지만 -1인 경우에는 미설정 상태이다. 즉, off된다.
Default Value -1
Example 200

(662) <domain> <servers> <server> <ejb-engine> <active-management> <max-idle-time>
Dynamic 동적 변경이 가능하다.
Description EJB 스레드가 Block되었다고 간주되는 상태를 정의한다. 이 설정값은 시간을 의미하며 만약, 어떤 스레드가 이 시간을 초과하여 Idle 상태를 유지한다면 이 스레드는 Block되었다고 간주된다.
Value Description 밀리세컨드
Value Type nonNegativeLongType
Value Type Description 0 이상의 Long 값이다.
Default Value 300000
Example 180000

(663) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify>
Non-Dynamic Logger 측에서는 동적 변경을 제공하지 않을 예정이다.
Description Active Management나 혹은 다른 비정상적인 상태에 의해서 서버가 재시작되어야 한다면 여기에 설정된 곳으로 e-mail을 보내서 상황을 알린다.
Value Type smtp-senderType
Child Elements

(664) smtp-host-address

(665) sender-id

(666) sender-password

(667) from-address

(668) to-address

(669) property*

(672) cc-address?

(673) bcc-address?

(664) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <smtp-host-address>
Description e-mail을 보낼 SMTP 서버의 주소를 지정한다.
Value Type valuableToken

(665) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <sender-id>
Description e-mail을 보낼 sender의 id를 지정한다.
Value Type valuableToken

(666) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <sender-password>
Description e-mail을 보낼 sender의 password를 지정한다. 암호화해서 저장할 때에는 '{암호화할 알고리듬}암호화된 password'와 같은 형식으로 입력한다.
Value Type valuableToken
Example {DES}FQrLbQ/D8O1lDVS71L28rw==

(667) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <from-address>
Description e-mail을 보내는 사람의 주소를 지정한다.
Value Type valuableToken

(668) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <to-address>
Description e-mail을 받는 사람의 주소를 지정한다.
Value Type valuableToken

(669) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <property>
Description 이용하는 mail서버에 특정한 smtp 프로퍼티를 지정한다. schema에 명시된 property와 겹치는 경우에는 schema의 값을 따른다.
Value Type propertyType
Child Elements

(670) key

(671) value

(670) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <property> <key>
Description 프로퍼티의 Key 값이다.
Value Type valuableToken

(671) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <property> <value>
Description 프로퍼티의 Value 값이다.
Value Type valuableToken

(672) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <cc-address>
Description e-mail을 참조로 받는 사람의 주소를 지정한다.
Value Type valuableToken

(673) <domain> <servers> <server> <ejb-engine> <active-management> <email-notify> <bcc-address>
Description e-mail을 숨은 참조로 받는 사람의 주소를 지정한다.
Value Type valuableToken

(674) <domain> <servers> <server> <ejb-engine> <timer-service>
Description EJB Timer Service에 대해 설정한다.
Value Type timer-serviceType
Child Elements

(675) support-persistence?

(676) max-retrial-count?

(677) retrial-interval?

(678) thread-pool?

(682) database-setting?

(675) <domain> <servers> <server> <ejb-engine> <timer-service> <support-persistence>
Non-Dynamic Persistence의 지원 여부를 동적으로 변경하는 것은 불가능하다.
Description EJB Timer의 지속성(persistence)를 지원할 것인지를 결정한다. EJB Timer는 기본적으로 지속적(persistent)이지만 지속적인 Timer를 사용하고 싶지 않는 경우에는 편의상 false로 설정해서 일괄적으로 Non Persistent로 지정할 수 있다.
Value Type boolean
Default Value true
Example true

(676) <domain> <servers> <server> <ejb-engine> <timer-service> <max-retrial-count>
Non-Dynamic Restart after change
Description Timeout Callback Method에서 오류가 발생하거나 해당 메소드에 연관된 트랜잭션이 Rollback되었을 경우 최대 재시도 횟수를 나타낸다.
Value Description 최대 재시도 횟수
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 1
Example 3

(677) <domain> <servers> <server> <ejb-engine> <timer-service> <retrial-interval>
Non-Dynamic Restart after change
Description 재시도 사이의 간격을 의미한다.
Value Description 밀리세컨드
Value Type nonNegativeLongType
Value Type Description 0 이상의 Long 값이다.
Default Value 5000
Example 5000

(678) <domain> <servers> <server> <ejb-engine> <timer-service> <thread-pool>
Description Timer Service가 Timeout Callback Method를 수행하는 Thread Pool에 대한 설정이다.
Value Type poolingType
Child Elements

(679) min?

(680) max?

(681) period?

(679) <domain> <servers> <server> <ejb-engine> <timer-service> <thread-pool> <min>
Description Pooling되는 객체의 최솟값을 지정한다.
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 2

(680) <domain> <servers> <server> <ejb-engine> <timer-service> <thread-pool> <max>
Description Pooling되는 객체의 최댓값을 지정한다.
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 30

(681) <domain> <servers> <server> <ejb-engine> <timer-service> <thread-pool> <period>
Description Pool에 있는 객체의 개수를 min 값에 지정된 개수만큼 줄인다.
Value Type long
Default Value 3600000
Performance Recommendation 설정값이 클수록 정리하는 주기가 길어져 서버를 운영할 때 부하가 줄어들 수 있지만 그만큼 메모리 사용량이 늘어날 수 있다.

(682) <domain> <servers> <server> <ejb-engine> <timer-service> <database-setting>
Non-Dynamic Persistence에 관한 설정을 동적으로 변경하는 것은 불가능하다.
Description Timer Service가 Persistent하게 관리하는 Timer Handle을 외부 DB에 저장하고 싶을 경우에 설정한다.
Value Type database-settingType
Child Elements

(683) data-source-id

(684) db-vendor?

(683) <domain> <servers> <server> <ejb-engine> <timer-service> <database-setting> <data-source-id>
Non-Dynamic Restart after change
Description Timer Service가 Timer의 Persistence를 제공하기 위해 사용하는 DB의 Connection Pool 이름이다. 반드시 Resources 항목의 DataSource 메뉴에 DB 리소스로 설정되어 있어야 하며, 되도록 XA 연동이 가능한 타입의 Connection Pool을 설정한다.
Value Type token

(684) <domain> <servers> <server> <ejb-engine> <timer-service> <database-setting> <db-vendor>
Non-Dynamic Restart after change
Description Timer Handle을 저장하기 위한 DB의 벤더를 나타낸다. 자동으로 벤더를 확인하지만 필요한 경우에 설정하도록 한다.
Value Type db-vendorType
Defined Value

oracle

informix

db2

mssql

sybase

hsql

cloudscape

mysql

tibero

Example Oracle

(685) <domain> <servers> <server> <ejb-engine> <async-service>
Description Asynchronous Invocation Service를 위한 설정이다.
Value Type async-serviceType
Child Elements

(686) thread-min?

(687) thread-max?

(688) access-timeout?

(686) <domain> <servers> <server> <ejb-engine> <async-service> <thread-min>
Non-Dynamic Restart after change
Description 유지할 스레드 개수의 최솟값을 설정한다.
Value Description 스레드 개수
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 0
Example 10

(687) <domain> <servers> <server> <ejb-engine> <async-service> <thread-max>
Non-Dynamic Restart after change
Description 유지할 스레드 개수의 최댓값을 설정한다.
Value Description 스레드 개수
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 30
Example 100

(688) <domain> <servers> <server> <ejb-engine> <async-service> <access-timeout>
Non-Dynamic Restart after change
Description Async Method가 수행이 완료된 후 일정시간이 지나도 클라이언트에서 Get하지 않으면 Future 객체를 삭제한다. 이는 클라이언트의 실수로 Get하지 않는 경우 Memory Leak의 발생을 방지하고자 함이다. Retrun 타입을 Future로 가지는 Async Method에 한해 적용된다.
Value Description 밀리세컨드
Value Type nonNegativeIntType
Value Type Description 0 이상의 Int 값이다.
Default Value 300000
Example 180000

11.4. domain.xml의 EJB 엔진 설정 예제

[예 11.1] domain.xml의 EJB 엔진 설정 예제

<?xml version="1.0" encoding="UTF-8"?>
<domain xmlns="http://www.tmaxsoft.com/xml/ns/jeus" version="7.0">
    <servers>
        <server>

            <ejb-engine>
                <!-- period of checking ejb engine for active management and beans for passivation -->
                <resolution>300000</resolution>

                <!-- unenable to write ejb exceptions into the user log specified in domain.xml -->
                <enable-user-notify>false</enable-user-notify>

                <!-- check the number of blocked threads and send an e-mail -->
                <active-management>
                    <max-blocked-thread>3</max-blocked-thread>
                    <max-idle-time>300000</max-idle-time>
                    <email-notify>
                        <smtp-host-address>mail.foo.com</smtp-host-address>
                        <from-address>admin@mail.foo.com</from-address>
                        <to-address>admin@mail.foo.com</to-address>
                        <cc-address>admin@mail.foo.com</cc-address>
                        <bcc-address>admin@mail.foo.com</bcc-address>
                    </email-notify>
                </active-management>

                <!-- use http-rmi invocation -->
                <invoke-http>
                    <url>/mycontext/RMIHandlerServlet</url>
                    <http-port>80</http-port>
                </invoke-http>

                <!-- configuration related to timer service -->
                <timer-service>
                    <support-persistence>true</support-persistence>
                    <max-retrial-count>1</max-retrial-count>
                    <retrial-interval>5000</retrial-interval>
                    <thread-pool>
                        <min>2</min>
                        <max>30</max>
                        <period>3600000</period>
                    </thread-pool>
                    <database-setting>
                        <db-vendor>oracle</db-vendor>
                        <data-source-id>datasource</data-source-id>
                    </database-setting>
                </timer-service>

                <!-- configuration related to async service -->
                <async-service>
                    <thread-min>0</thread-min>
                    <thread-max>30</thread-max>
                    <access-timeout>300000</access-timeout>
                </async-service>
            </ejb-engine>
            
        </server>
    </servers>
</domain>