제5장 JEUS MQ 서버 설정

내용 목차

5.1. 서버 구조
5.2. 서버 추가
5.3. 기본 설정(JMSMain.xml)
5.3.1. 서비스 채널 설정
5.3.2. Connection Factory 설정
5.3.3. Destination 설정
5.3.4. Persistence Store 기본 설정
5.4. 고급 설정
5.4.1. Secure Socket Layer 설정
5.4.2. Thread Pool 설정
5.4.3. Durable Subscriber 설정
5.4.4. Destination 메모리 관리 설정
5.4.5. 메시지 흐름 제어 설정
5.4.6. 메시지 재전달 지연 설정
5.4.7. 미처리된 메시지를 보관하기 위한 Destination 설정
5.4.8. 클라이언트 설정값 강제 Override 기능
5.4.9. 메시지 만료 정책 설정
5.4.10. Persistence Store 고급 설정
5.5. 서버 관리
5.5.1. 콘솔 툴(jmsadmin)에 의한 관리
5.5.2. WebAdmin에 의한 관리

본 장에서는 엔진 컨테이너에 JEUS MQ 서버를 추가하는 방법을 설명한다.

5.1. 서버 구조

JEUS MQ 서버는 JMS 엔진으로 포함되며, 엔진 컨테이너당 하나의 JEUS MQ 서버가 실행될 수 있다. JEUS의 각 구성 요소에 대한 설명은 JEUS Server 안내서”의 “제1장 소개”를 참고한다.

다음은 JEUS 및 JEUS MQ 서버를 설정하고 관리하기 위한 파일들의 위치를 보여준다. JEUS_HOME은 JEUS가 설치된 경로를 나타낸다.

[그림 5.1] JEUS MQ 서버 관련 파일들

JEUS MQ 서버 관련 파일들

각 디렉터리에 대한 설명은 다음과 같다.

bin
설명
jeusadminJEUS Manager를 관리하기 위한 콘솔 툴이다. JEUS Manager와 엔진 컨테이너 제어를 포함해 JEUS 전반에 대한 관리 기능을 제공한다. 해당 툴에 대한 자세한 설명은 JEUS Reference Book”의 “4.2. jeusadmin”를 참고한다.
jmsadminJEUS MQ 서버를 관리하기 위한 콘솔 툴이다. 해당 툴에 대한 자세한 설명은 “5.5.1. 콘솔 툴(jmsadmin)에 의한 관리”를 참고한다.
config
파일설명
JEUSMain.xmlJEUS Manager와 엔진 컨테이너 설정 파일이다. 해당 파일의 설정 방법에 대한 자세한 설명은 “5.2. 서버 추가”를 참고한다.
JMSMain.xmlJEUS MQ 서버 설정 파일이다. 해당 파일의 설정 방법에 대한 자세한 설명은 “5.3. 기본 설정(JMSMain.xml)”를 참고한다.

5.2. 서버 추가

JEUSMain.xml 파일에는 JEUS Manager가 제공하는 여러 가지 서비스와 엔진 컨테이너 및 엔진 컨테이너에 포함된 엔진 등에 관한 설정 정보를 포함하고 있다.

참고

JEUS 전체의 설정 방법에 대해서는 JEUS Server 안내서”의 “제2장 JEUS 설정” 부분을 참고한다.

JEUS Manager는 엔진 컨테이너의 로딩 과정에서 JEUSMain.xml에 설정되어 있는 엔진을 실행시킨다.

JEUSMain.xml 파일의 엔진 컨테이너 설정 부분에 type이 JMS인 엔진을 추가하면 다음의 파일에서 설정한 JEUS MQ 서버가 JEUS와 함께 구동되도록 할 수 있다.

JEUS_HOME\config\<node-name>\<node-name>_jms_<engine-name>\JMSMain.xml

c:\jeus 위치에 JEUS를 설치한 경우 c:\jeus\config\JEUSMain.xml 설정 파일이 앞의 예와 같이 작성된 파일을 c:\jeus\config\johan\johan_jms_engine1\JMSMain.xml 파일로 작성해서 JEUS MQ 서버를 설정한다.

[예 5.1] 서버 추가 설정 : <<JEUSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <node>
        <name>johan</name>
        . . .
        <engine-container>
            <name>container1</name>
            . . .
            <engine-command>
                <type>jms</type>
                <name>engine1</name>
            </engine-command>
        </engine-container>
        . . .
    </node>
</jeus-system>

5.3. 기본 설정(JMSMain.xml)

JEUS MQ 서버에 대한 모든 정보는 다음의 파일에 저장되어 있다.

JEUS_HOME\config\<node-name>\<node-name>_jms_<engine-name>\JMSMain.xml

이 설정 파일은 다음과 같은 구조를 갖는다.

[예 5.2] JEUS MQ 서버 기본 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <broker-name>johan</broker-name>
    <service-config>
        . . .    <!-- “5.3.1. 서비스 채널 설정” 참고 -->
    </service-config>
    <failover>
       . . .    <!-- “제3장 JEUS MQ 장애 극복” 참고 -->
   </failover>
    <thread-pool>
        . . .    <!-- “5.4.2. Thread Pool 설정” 참고 -->
    </thread-pool>
    <access-log>
        . . .    <!-- JEUS Server 안내서”의 “제11장 Logging” 참고 -->
    </access-log>
    <durable-subscriber>
        . . .    <!-- “5.4.3. Durable Subscriber 설정” 참고 -->
    </durable-subscriber>
    <connection-factory>
        . . .    <!-- “5.3.2. Connection Factory 설정”참고 -->
    </connection-factory>
    <destination>
        . . .    <!-- “5.3.3. Destination 설정” 참고 -->
    </destination>
    <persistence-store>
        . . .    <!-- “5.3.4. Persistence Store 기본 설정” 참고 -->
    </persistence-store>
    <jms-server-cluster>
        . . .    <!-- “4.3.1. 서버 설정” 참고 -->
    </jms-server-cluster>
</jms-server>
      

참고

각 Element의 값 유형, 기본값, 설정 예 및 Element 간 포함 관계 등의 자세한 설명은 참고 자료에 소개된 XML Reference를 참고한다.

5.3.1. 서비스 채널 설정

JEUS MQ 서버는 서비스 채널(Service Channel)을 통해서 클라이언트와 통신한다. 하나의 JEUS MQ 서버에는 최소한 하나의 서비스 채널이 있어야 하며, 각 서비스 채널마다 서비스 URL 등의 네트워크 설정을 다르게 지정할 수 있다.

서비스 채널이 사용하는 서비스 URL은 <server-address>와 <port>를 같이 사용하거나, 또는 <server-url>을 단독으로 사용하여 설정할 수 있다.

다음은 JMSMain.xml 파일의 서비스 채널을 설정하는 2가지 방법에 대한 예이다. 설정 정보는 <service-config> 태그 안에 설정되며 2가지 방법 중 반드시 한 가지 방법은 사용해야 한다.

  • <server-address>와 <port>를 같이 사용한 예

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
            <name>internal</name>
            <server-address>127.0.0.1</server-address>
            <port>9741</port>
            <blocking-socket>false</blocking-socket>
            <client-keepalive-timeout>30</client-keepalive-timeout>
        </service-config>
        . . .
    </jms-server>
  • <server-url>을 단독으로 사용한 예

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
            <name>internal</name>
            <server-url>tcp://127.0.0.1:9741</server-url>
            <blocking-socket>false</blocking-socket>
            <client-keepalive-timeout>30</client-keepalive-timeout>
        </service-config>
        . . .
    </jms-server>
  • <server-url>에 virtual-tcp를 사용한 예

    이때 <server-url>항목에 'virtual-tcp://'로 시작하는 url을 넣음으로써 실제 머신의 주소가 아닌 가상의 주소를 설정할 수도 있다. 주로 HP-HA를 지원하기 위한 기능이다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
            <name>internal</name>
            <server-url>virtual-tcp://192.168.0.100:9741</server-address>
            <blocking-socket>false</blocking-socket>
            <client-keepalive-timeout>30</client-keepalive-timeout>
        </service-config>
        . . .
    </jms-server>

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

태그설명
<name><name>을 사용해 지정한 서비스 채널의 이름은 Connection Factory 설정에서 참조한다.
<blocking-socket>

서비스 채널의 정보를 설정한다.

  • true : 서비스 채널에 Blocking Socket을 사용한다.

  • false : 서비스 채널에 Non-Blocking Socket을 사용한다. Non-Blocking Socket을 사용하면 같은 서버 리소스를 사용해서 더 많은 클라이언트를 처리할 수 있다는 장점이 있다.

<client-keepalive-timeout>

클라이언트와의 연결이 비정상적으로 종료된 경우 JEUS MQ 서버는 해당 서비스 채널에서 <client-keepalive-timeout>으로 지정한 시간 동안 클라이언트 리소스를 해제하지 않고 클라이언트의 재접속을 기다린다.

이 시간 내에 클라이언트가 재접속에 성공하면 연결이 끊어지지 않았을 때와 마찬가지로 작업을 계속 진행할 수 있다. 하지만 이 시간이 지나면 서버에서 클라이언트 리소스가 삭제되므로 클라이언트가 재접속 하여도 이전에 진행 중이던 작업에 대한 정보 일부를 복구하지 못하게 된다.

JEUS MQ 서비스 채널에서 JEUS 엔진 컨테이너의 Base Port를 통해 서비스할 수 있다. 이를 위해서는 2가지 방법으로 설정이 가능하다.

  • <server-address>, <port>를 사용하는 경우에는 <server-address>를 설정하지 않고 <port>는 0이나 설정을 하지 않으면 된다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
            <name>internal</name>
            <port>0</port>
            <blocking-socket>false</blocking-socket>
            <client-keepalive-timeout>30</client-keepalive-timeout>
        </service-config>
        . . .
       </jms-server>
  • <server-url>을 사용하는 경우에는 <server-url>에 "oneport"를 설정한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
            <name>internal</name>
            <server-url>oneport</server-url>
            <blocking-socket>false</blocking-socket>
            <client-keepalive-timeout>30</client-keepalive-timeout>
        </service-config>
        . . .
        </jms-server>

참고

JEUS의 포트 통합 기능에 대해서는 JEUS Server 안내서”의 “제1장 소개”의 JEUS Base Port 설명을 참고한다.

5.3.2. Connection Factory 설정

Connection Factory는 JMS 관리 객체로 클라이언트가 JMS 서버에 접속하는 데 필요한 연결 설정 정보와 클라이언트를 위한 기본 정보들을 가지고 있다. JEUS MQ의 경우 JMSMain.xml에 설정되며 JEUS MQ 서버가 기동될 때 생성되어 JEUS JNDI 서비스에 등록된다.

다음은 JMSMain.xml은 <connection-factory> 태그 아래 기본적인 Connection Factory를 설정한 예이다.

[예 5.3] Connection Factory 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <connection-factory>
        <type>nonxa</type>
        <name>ConnectionFactory</name>
        <export-name>jms/ConnectionFactory</export-name>
    </connection-factory>

    <connection-factory>
        <type>queue</type>
        <name>QueueConnectionFactory</name>
        <export-name>jms/QueueConnectionFactory</export-name>
    </connection-factory>

    <connection-factory>
        <type>topic</type>
        <name>TopicConnectionFactory</name>
        <export-name>jms/TopicConnectionFactory</export-name>
    </connection-factory>
    . . .
</jms-server>


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

태그설명
<type>Connection Factory의 <type>으로는 nonxa, queue, topic, xa, xaqueue, xatopic 중 하나를 지정할 수 있다.
<export-name>

설정한 Connection Factory는 JEUS JNDI 서비스에서 <export-name>으로 Lookup 가능하다.

<export-name>을 지정하지 않으면 <name> 값이 사용된다. 서비스 채널이 여러 개인 경우 service Element를 사용하여 해당 Connection Factory를 사용해 생성한 커넥션을 처리할 서비스 채널의 이름을 지정할 수 있다. 서비스 채널을 지정하지 않으면 JMSMain.xml에서 정의한 서비스 채널 중 첫 번째 서비스 채널이 사용된다.

5.3.3. Destination 설정

Queue나 Topic과 같은 Destination 역시 JEUS MQ 서버가 기동할 때 JMSMain.xml 파일의 설정을 읽어 JEUS JNDI 서비스에 등록한다.

다음은 Destination 설정한 JMSMain.xml 예로 설정 값은 <destination> 태그 안에 구성한다.

[예 5.4] Destination 설정 : <<JMSMain.xml >>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <destination>
        <type>queue</type>
        <name>ExamplesQueue</name>
        <export-name>jms/ExamplesQueue</export-name>
    </destination>

    <destination>
        <type>topic</type>
        <name>ExamplesTopic</name>
        <export-name>jms/ExamplesTopic</export-name>
    </destination>
    . . .
</jms-server>


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

태그설명
<type>Destination의 <type>으로는 queue와 topic 중 하나를 지정할 수 있다.
<export-name>

Connection Factory와 마찬가지로 설정한 Destination은 <export-name>으로 JNDI Lookup 할 수 있고, <export-name>을 지정하지 않으면 <name> 값이 사용된다.

5.3.4. Persistence Store 기본 설정

Persistence Store는 서버가 재기동될 때 메시지나 Subscription, 트랜잭션들의 이전 상태를 복구하기 위해 필요하다. Persistence Store를 설정하지 않으면 클라이언트에서 DeliveryMode.PERSISTENT 방식으로 메시지를 송신한 경우에 서버에서 장애가 발생했을 때 메시지 전달을 보장할 수 없다.

JEUS MQ에서 제공하는 Persistence Store의 종류에는 저널 로그와 데이터베이스가 있다.

저널 로그 방식으로 Persistence Store를 사용할 경우에는 다음과 같이 <persistence-store> 태그 아래 설정한다.

[예 5.5] Persistence Store 기본 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <persistence-store>
        <journal>
            <base-dir>/home/jeus/store/jeusmq</base-dir>
            <initial-log-file-count>5</initial-log-file-count>
            <max-log-file-count>10</max-log-file-count>
            <log-file-size>128M</log-file-size>
            <property>
                <key>jeus.store.journal.overflow-factor</key>
                <value>0.2</value>
            </property>
            ...
        </journal>
    </persistence-store>
    . . .
</jms-server>


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

태그설명
<base-dir>저널 로그 파일들이 생성될 디렉터리를 의미한다. 이 디렉터리는 Persistence Store 간에 공유되지 않으므로 다른 Persistence Store 설정과 중복되지 않도록 해야한다.
<initial-log-file-count>Persistence Store를 생성할 때 초기에 몇 개의 로그 파일들을 생성하는지를 설정한다.
<max-log-file-count>

최대로 생성될 로그 파일의 수를 설정한다.

저널 로그 파일들에 데이터가 계속 쌓이게 되어 파일의 수가 이 값에 이르게 되면 Persistence Store는 다음 레코드를 쓸 공간을 마련하기 위해서 로그 파일 정리 작업을 하게 되어 다소 느려질 수 있으므로 예상되는 메시지 처리량에 맞추어서 충분한 개수를 미리 만들어 놓는 것이 좋다.

<log-file-size>각 로그 파일들의 크기를 지정하게 된다. 로그 파일의 수를 너무 크게 하면 로그 파일들 간의 재사용성이 떨어질 수 있으므로 이것도 메시지 처리량에 따라 다르게 설정해야 한다.
<property>

위의 4가지 설정 이외에도 저널 로그에 적용하는 여러 속성들을 추가적으로 설정할 수 있도록 마련된 요소이다. 이 추가적인 요소들에 대해서는 “Appendix A. 저널 스토어 추가 속성들”을 참고한다.

데이터베이스를 Persistence Store로 사용할 경우에는 JEUSMain.xml에 정의된 데이터 소스를 설정한다.

다음은 외부 데이터베이스를 Persistence Store로 설정한 예이다.

현재 호환 가능한 외부 데이터베이스는 다음과 같다.

  • Oracle Database 9i 이상 (Enterprise Edition)

  • Tibero 3.0 SP2 이상

  • Altibase 4.x (5 이상은 지원하지 않음)

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <persistence-store>
        <jdbc>
            <data-source>datasource1</data-source>
            ...
        </jdbc>
    </persistence-store>
    . . .
</jms-server>

위 예에서 'datasource1'은 Persistence Store로 사용할 사용할 데이터 소스의 JNDI 이름이다. JEUS에 데이터 소스를 추가하는 방법은 JEUS Server 안내서”의 “제8장 DB Connection Pool과 JDBC”에 소개되어 있다.

위와 같은 기본 설정을 사용하는 경우 해당 데이터베이스 내의 <BROKER-NAME>_DEST, <BROKER-NAME>_DSUB, <BROKER-NAME>_MESG, <BROKER-NAME>_SMSG, <BROKER-NAME>_TRAN이라는 이름의 테이블을 사용하게 된다.

5.4. 고급 설정

본 절에서는 JEUS MQ 서버의 고급 설정에 대해서 알아본다.

5.4.1. Secure Socket Layer 설정

JEUS MQ에서는 통신 레벨에서의 보안을 위해 서비스 채널에 Secure Socket Layer(이후 SSL)를 사용할 수 있도록 지원하고 있다. JEUS MQ에서는 Blocking, Non-Blocking에서 모두 SSL을 지원하고 있으며 SSL을 사용하기 위해서는 서버뿐만 아니라 클라이언트에도 별도의 설정이 필요하다.

SSL 사용을 위한 서버 설정

다음은 SSL 사용을 위한 서버 설정 방법이다.

  1. SSL을 설정하기 위해서는 <use-ssl>의 값을 true로 설정해야한다. 그렇지 않을 경우 이후 SSL 설정은 무시된다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
        . . .
        <service-config>
        <name>SSL_SERVICE</name>
            <server-address>127.0.0.1</server-address>
        <port>1486</port>
        <blocking-socket>true</blocking-socket>
            <use-ssl>true</use-ssl>
            <ssl-configuration>
                <protocol>TLS</protocol>
                <key-store-type>JKS</key-store-type>
                <key-store-file>c:\jeus\jeus\config\keystore</key-store-file>
                <key-store-pass>changeit</key-store-pass>
                <key-management-algorithm>SunX509</key-management-algorithm>
            </ssl-configuration>
        <connection-timeout>1000</connection-timeout>
        <client-keepalive-timeout>10</client-keepalive-timeout>
    </service-config>
    . . .
    </jms-server>
  2. <use-ssl>을 true로 설정한 다음 SSL 통신에 필요한 여러 파라미터 값들을 설정한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
          . . .
          <service-config>
              <name>SSL_SERVICE</name>
              <server-address>127.0.0.1</server-address>
              <port>1486</port>
              <blocking-socket>true</blocking-socket>
              <use-ssl>true</use-ssl>
              <ssl-configuration>
                  <protocol>TLS</protocol>
                  <key-store-type>JKS</key-store-type>
                  <key-store-file>c:\jeus\jeus\config\keystore</key-store-file>
                  <key-store-pass>changeit</key-store-pass>
                  <key-management-algorithm>SunX509</key-management-algorithm>
              </ssl-configuration>
              <connection-timeout>1000</connection-timeout>
              <client-keepalive-timeout>10</client-keepalive-timeout>
          </service-config>
      . . .
     </jms-server>
  3. Client Authentication이 필요한 경우 <client-auth>를 추가하여 설정한다.

    <?xml version="1.0" encoding="UTF-8"?>
    <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
          . . .
          <service-config>
              <name>SSL_SERVICE</name>
              <server-address>127.0.0.1</server-address>
              <port>1486</port>
              <blocking-socket>true</blocking-socket>
              <use-ssl>true</use-ssl>
              <ssl-configuration>
                  <protocol>TLS</protocol>
                  <key-store-type>JKS</key-store-type>
                  <key-store-file>c:\jeus\jeus\config\keystore</key-store-file>
                  <key-store-pass>changeit</key-store-pass>
                  <key-management-algorithm>SunX509</key-management-algorithm>
                  <client-auth>
                      <trust-store-type>JKS</trust-store-type>
                      <trust-store-file>c:\jeus\jeus\config\truststore</trust-store-file>
                      <trust-store-pass>changeit</trust-store-pass>
                      <trust-management-algorithm>SunX509</trust-management-algorithm>
                  </client-auth>          
              </ssl-configuration>
              <connection-timeout>1000</connection-timeout>
              <client-keepalive-timeout>10</client-keepalive-timeout>
          </service-config>
      . . .
    </jms-server>

SSL 사용을 위한 클라이언트 설정

클라이언트에서는 JVM 옵션으로 SSL 설정을 할 수 있다. 클라이언트는 key-store와 trust-store를 모두 설정해야 한다.

java -Djeus.jms.ssl.protocol=TLS -Djeus.jms.ssl.keystore.type=JKS 
    -Djeus.jms.ssl.keystore.passphrase=changeit 
    -Djeus.jms.ssl.keystore.file=;c:\jeus\jeus\config\keystore 
    -Djeus.jms.ssl.keymanagement.algorithm=SunX509
    -Djeus.jms.ssl.truststore.type=JKS 
    -Djeus.jms.ssl.truststore.passphrase=changeit
    -Djeus.jms.ssl.truststore.file=;c:\jeus\jeus\config\truststore 
    -Djeus.jms.ssl.trustmanagement.algorithm=SunX509 ... 

5.4.2. Thread Pool 설정

JEUS MQ 서버가 사용하는 Thread Pool에 대한 정보를 설정한다.

JMS의 비동기적인 특성에 따라 클라이언트와 메시지를 주고받거나 서버 내부에서 메시지를 처리하고 스토리지에 저장하는 등의 작업은 각각 별도의 스레드에 의해 수행된다. JEUS MQ 서버 내에서 동시에 실행 가능한 스레드의 개수는 이 Thread Pool 설정에 의해 결정된다.

서버의 성능에 크게 영향을 미치므로 동시 처리 가능한 클라이언트의 수와 서버에 걸리는 부하 등을 고려한 적절한 설정이 필요하다.

[예 5.6] Thread Pool 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <thread-pool>
        <min>5</min>
        <max>300</max>
        <keep-alive-time>120000</keep-alive-time>
    </thread-pool>
    . . .
</jms-server>


5.4.3. Durable Subscriber 설정

일반적으로 Durable Subscriber는 클라이언트가 생성하기 때문에 생성 이전에 Topic에 도착한 메시지는 클라이언트에게 전달되지 않는다. 이런 상황을 피하기 위해 JEUS MQ는 JMSMain.xml 환경 파일에 Durable Subscriber를 설정하여 서버가 실행될 때 미리 Durable Subscriber를 등록해 두었다가 조건에 맞는 클라이언트가 접속했을 때 메시지를 전달하는 기능을 제공한다.

Session.createDurableSubscriber() 메소드를 호출할 때 클라이언트 ID와 Subscription 이름 및 Topic이 필요한 것처럼 JMSMain.xml에 Durable Subscriber를 설정할 때도 클라이언트 ID, Subscription 이름, Topic 이름을 지정해야 한다. 추가로 메시지 셀렉터도 설정할 수 있다.

[예 5.7] Durable Subscriber 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <durable-subscriber>
        <client-id>client_id1</client-id>
        <name>subscription1</name>
        <destination-name>ExamplesTopic</destination-name>
    </durable-subscriber>
    . . .
</jms-server>


5.4.4. Destination 메모리 관리 설정

Destination에 클라이언트에게 전달되지 않은 메시지가 계속해서 늘어나면 JVM이 OutOfMemoryError를 내면서 서버가 종료될 수 있다. 이를 막기 위해 JMSMain.xml 파일을 통해 JEUS MQ는 Destination별로 메모리 관리 정책을 설정할 수 있는 방법을 제공한다.

Destination 설정 내에 <low-mark>, <high-mark>, <limit> 값을 지정하면 메모리 사용량에 따라 JEUS MQ 서버는 다음과 같이 동작한다.

  • Destination이 많은 메모리를 사용하고 있지 않을 때, JEUS MQ 서버는 메시지 내용에 대한 Strong Reference를 가지고 있는다.

  • Destination이 사용하고 있는 메모리가 <low-mark> 값 이상이면, 스토리지에 저장된 메시지의 내용을 Soft Reference의 형태로 유지한다. 이 상태의 메시지 내용은 메모리가 부족할 때 메모리에서 지워질 수 있다.

  • Destination이 사용하고 있는 메모리가 <high-mark> 값 이상이면, 스토리지에 저장한 메시지의 내용은 메모리에서 관리하지 않는다.

  • Destination이 사용하고 있는 메모리가 <limit> 값 이상이면, 클라이언트의 메시지 송신 시도는 실패하고 JMSException이 발생한다.

Destination에 도착한 메시지의 내용이 메모리에서 삭제되더라도 메시지가 유실되는 것은 아니다. 메시지는 스토리지에 저장되어 있기 때문에 JEUS MQ 서버는 필요할 때 메시지 내용을 스토리지로부터 읽어서 처리하게 된다. 이 경우 처리 속도는 메시지 내용이 메모리에 있을 때보다 느릴 수 밖에 없다.

[예 5.8] Destination 메모리 관리 설정: <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <destination>
        <type>queue</type>
        <name>ExamplesQueue</name>
        <export-name>jms/ExamplesQueue</export-name>
        <!-- limit = 16MB -->
        <limit>16777216</limit>
        <!-- high-mark = 64MB -->
        <high-mark>67108864</high-mark>
        <!-- low-mark = 32MB -->
        <low-mark>33554432</low-mark>
    </destination>
    . . .
</jms-server>


<limit>는 1GB, <high-mark>는 0.75GB를 기본값으로 지정하고 있지만, <low-mark>의 경우는 기본값이 0이므로 별도로 설정하지 않으면 메시지는 항상 소프트 캐싱된다는 점에 유의한다.

참고

JEUS MQ 서버는 스토리지에 저장하지 않은 메시지 내용은 항상 메모리에 가지고 있으므로, <high-mark>와 <low-mark>에 의한 설정은 스토리지가 설정되어 있고 메시지를 DeliveryMode.PERSISTENT로 지정한 경우에만 영향을 미치게 된다.

5.4.5. 메시지 흐름 제어 설정

메시지 수신자가 Destination에 Message Listener를 등록한 경우 JEUS MQ 서버는 Destination에 메시지가 도착하면 해당 클라이언트에게 메시지를 전송한다. 그런데 서버가 메시지를 전송하는 속도보다 클라이언트에서 메시지를 처리하는 속도가 느리면 클라이언트 메모리에 메시지가 계속해서 쌓이게 되고, 결국 클라이언트 JVM에서 OutOfMemoryError가 발생할 수 있다.

이와 같은 상황을 방지하기 위해 클라이언트 측에 아직 처리되지 않고 쌓여 있는 메시지의 최대 개수를 설정하여 이 개수를 초과하면 서버가 클라이언트로 잠시 동안 메시지를 전송하지 않도록 할 수 있다.

이 값은 다음의 예제와 같이 JMSMain.xml에 Destination별로 지정 가능하다. 설정 정보는 <destination> 태그 아래 구성한다.

[예 5.9] 메시지 흐름 제어 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <destination>
        <type>queue</type>
        <name>ExamplesQueue</name>
        <export-name>jms/ExamplesQueue</export-name>
        <max-pending-limit>1000</max-pending-limit>
        <resume-dispatch-factor>0.5</resume-dispatch-factor>
    </destination>
    . . .
</jms-server>


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

항목설명
<max-pending-limit>

메시지의 최대 개수이다. 설정하지 않으면 기본값이 설정된다.

(기본값: 8,192)

<resume-dispatch-factor>

<max-pending-limit> 설정에 의해 JEUS MQ 서버가 클라이언트로 메시지 전송을 멈춘 경우 <max-pending-limit> 값을 기준으로 어느 비율까지 클라이언트에 쌓여 있는 메시지 개수가 줄어 들었을 때 메시지 전송을 재개할지 여부를 지정한다.

위 예제에서는 클라이언트에 쌓인 메시지가 1,000개가 되면 서버가 메시지 전송을 멈추고, 500개까지 줄어 들었을 때 메시지 전송을 재개하게 된다. 설정하지 않으면 기본값으로 설정된다. (기본값: 0.4)

5.4.6. 메시지 재전달 지연 설정

Transaction이 Rollback되거나 Client Acknowledge 모드일 때 명시적인 Acknowledge를 하지 않고 Session이나 Connection을 닫아서 메시지가 서버로 되돌아갔다가 다시 서비스가 되는 경우 다음 서비스까지 잠시 지연되도록 설정할 수 있다.

다음은메시지 재전달 지연 설정로 예로 JMSMain.xml에 Destination별로 지정 가능하다. 설정 정보는 <destination> 태그 아래 구성한다.

[예 5.10] 메시지 재전달 지연 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
  <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
      . . .
      <destination>
          <type>queue</type>
          <name>ExamplesQueue</name>
          <export-name>jms/ExamplesQueue</export-name>
          <redelivery-delay>10000</redelivery-delay>
      </destination>
      . . .
  </jms-server>


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

항목설명
<redelivery-delay>메시지 재전달까지 지연시킬 시간을 설정한다. (단위: ms)

5.4.7. 미처리된 메시지를 보관하기 위한 Destination 설정

메시지 전송을 시도했으나 메시지 수신자에서 여러번 반복해서 오류가 발생하였거나 만료되어 더 이상 전달되어서는 안 되는 메시지 등 미처리된 메시지들을 보관하는 Destination을 별도로 지정할 수 있다.

다음은 미처리된 메시지를 보관하기 위한 Destination 설정의 예로 JMSMain.xml에 Destination별로 지정 가능하다. 설정 정보는 <destination> 태그 아래 구성한다.

[예 5.11] 미처리 메시지 보관용 Destination 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
  <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
      . . .
      <destination>
          <type>queue</type>
          <name>ExamplesQueue</name>
          <export-name>jms/ExamplesQueue</export-name>
          <dead-letter-destination>DeadLetterQueue</dead-letter-destination>
      </destination>
      . . .
  </jms-server>


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

항목설명
<dead-letter-destination>

오류나 만료로 인해 미처리된 메시지를 보관할 Destination을 설정한다.

(기본값: JEUS_DLQ)

5.4.8. 클라이언트 설정값 강제 Override 기능

클라이언트에서 프로그램적으로 설정하는 각종 수치들을 서버에 도착하는 순간 강제로 Override해주는 기능을 제공한다. 이 기능을 통해서 클라이언트 프로그램을 수정하지 않고 서버 설정만을 바꾸어서 클라이언트 프로그램의 동작을 바꿀 수도 있다.

다음은 클라이언트 설정값 강제 Override 기능 설정의 예로 JMSMain.xml에 Destination별로 지정 가능하다. 설정 정보는 <destination> 태그 아래 구성한다.

[예 5.12] 미처리 메시지 보관용 Destination 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
  <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
      . . .
      <destination>
          <type>queue</type>
          <name>ExamplesQueue</name>
          <export-name>jms/ExamplesQueue</export-name>
          <override-client-attributes>
              <expiration-time>500000</expiration-time>
          </override-client-attributes>
      </destination>
      . . .
  </jms-server>


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

항목설명
<expiration-time>메시지 송신자에 의해 정의된 timeToLive (expiration-time) 설정에 우선하여 이 값을 적용시킨다.

5.4.9. 메시지 만료 정책 설정

JMS Specification 1.1의 항목 3.4.9 JMSExpiration에 따르면 메시지에 expiration time이 설정된 경우 메시지 수신자가 해당 메시지를 받지 않도록 해야한다고만 명시되어있으며 서버에서 정확히 어떤식으로 다루라고 명시하지는 않고 있다. 따라서 JEUS MQ에서는 만료되는 메시지들을 어떻게 다룰지에 대한 다양한 policy를 설정할 수 있도록 지원하고 있다.

다음은 메시지 만료 정책 설정의 예로 JMSMain.xml에 Destination별로 지정 가능하다. 설정 정보는 <destination> 태그 아래 구성한다.

[예 5.13] 메시지 만료 정책 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
  <jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
      . . .
      <destination>
          <type>queue</type>
          <name>ExamplesQueue</name>
          <export-name>jms/ExamplesQueue</export-name>
          <expiration-policy>Delete</expiration-policy>
      </destination>
      . . .
  </jms-server>


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

항목설명
<expiration-policy>

메시지가 만료될 경우 어떻게 다룰 것인지 정책을 설정한다.

  • Delete: 만료된 메시지를 즉시 삭제한다.

  • Redirect: 만료된 메시지를 Dead Letter Destination으로 보낸다.

5.4.10. Persistence Store 고급 설정

본 절에서는 앞서 “5.3.4. Persistence Store 기본 설정”에서 소개한 간단한 설정에 덧붙여 몇 가지 고급 옵션에 대해 설명한다.

다음은 Persistence Store 설정의 예로 설정 정보는 <persistence-store> 태그 아래 구성한다.

[예 5.14] Persistence Store 고급 설정 : <<JMSMain.xml>>

<?xml version="1.0" encoding="UTF-8"?>
<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    . . .
    <persistence-store>
        <jdbc>
            <data-source>datasource1</data-source>
            <destination-table>
                TEST_DEST
            </destination-table>
            <durable-subscriber-table>
                TEST_DSUB
            </durable-subscriber-table>
            <message-table>
                TEST_MESG
            </message-table>
            <subscription-message-table>
                TEST_SMSG
            </subscription-message-table>
            <transaction-table-name>
                TEST_TRAN
            </transaction-table-name>
        </jdbc>
    </persistence-store>
    . . .
</jms-server>


위의 예에서 사용하는 테이블 이름을 지정하는 각 Element들의 용도는 다음과 같다.

태그설명
<destination-table>

Destination 정보를 저장할 테이블 이름이다.

(기본값: <BROKER-NAME>_DEST)

<durable-subscriber-table>

Durable Subscriber 정보를 저장할 테이블 이름이다.

(기본값: <BROKER-NAME>_DSUB)

<message-table>

메시지 정보를 저장할 테이블 이름이다.

(기본값: <BROKER-NAME>_MESG)

<subscription-message-table>

각 메시지에 대한 Subscription 상태를 관리하는 테이블 이름이다.

(기본값: <BROKER-NAME>_SMSG)

<trasaction-table-name>

트랜잭션 정보를 저장할 테이블 이름이다.

(기본값: <BROKER-NAME>_TRAN)

이 태그들을 사용하면 운용 중인 서버에서 테스트를 수행하는 경우 별도의 Persistence Store를 설치하지 않고도 사용하는 테이블의 이름만 바꿔서 JEUS MQ 서버를 테스트 하는 것이 가능하다.

5.5. 서버 관리

JEUS MQ 서버 관리는 다음과 같은 작업을 통해 메시지 유실 없이 지속적인 서비스가 가능하도록 하는 것이다.

  • 운용 중인 JEUS MQ 서버의 리소스 관리 및 모니터링

    관리 및 모니터링의 대상이 되는 리소스에는 다음과 같은 사항이 있다.

    • Connection Factory, Destination과 같은 JMS 관리 객체

    • Destination과 Durable Subscription의 메시지

    • 클라이언트에 할당된 커넥션, 세션, 메시지 송·수신자

    • JEUS MQ 서버가 차지하는 메모리 영역

    • JEUS MQ 서버가 사용하는 Persistent 스토리지

  • 장애 상황에 대처하고 장애로부터 JEUS MQ 서버를 복구

본 장에서는 jmsadmin이라는 콘솔 툴과 JEUS WebAdmin을 사용하여 JEUS MQ 서버를 관리하는 방법에 대해 설명한다.

5.5.1. 콘솔 툴(jmsadmin)에 의한 관리

jmsadmin은 JEUS MQ 전용 콘솔 툴로, 자체 프롬프트에서 여러 가지 명령어를 실행함으로써 관리 작업을 수행할 수 있게 해준다. 실행 스크립트는 다음의 경로에 위치한다.

JEUS_HOME\bin\

jmsadmin은 다음 명령어들을 제공한다.

  • 서버 관련

    명령어설명
    server서버 정보를 조회한다.
    mbeanlistMBean 목록을 조회한다.
  • Connection Factory 관련

    명령어설명
    confallConnection Factory 목록을 조회한다.
    confConnection Factory 정보를 조회한다.
    createconfConnection Factory 추가한다.
    removeconfConnection Factory 제거한다.
  • Destination 관련

    명령어설명
    destallDestination 목록을 조회한다.
    destDestination 정보 출력 및 메시지 관리한다.
    createdestDestination 추가한다.
    removedestDestination 제거한다.
    stat메시지 통계 정보를 조회한다.
    restat메시지 통계 정보를 초기화한다.
  • Durable Subscriber 관련

    명령어설명
    durableallDurable Subscriber 목록을 조회한다.
    durableDurable Subscriber 정보를 조회한다.
  • 클라이언트 관련

    명령어설명
    entryall클라이언트 목록을 조회한다.
    entry클라이언트 정보 출력 및 커넥션을 관리한다.
  • 트랜잭션관련

    명령어설명
    ptallpending 트랜잭션 목록을 출력한다.
    commitprepared상태의 트랜잭션을 강제로 Commit한다.
    rollbackprepared상태의 트랜잭션을 강제로 Rollback한다.

참고

명령어에 대한 자세한 설명과 사용법, 사용 예는 JEUS Reference Book”의 “4.3. jmsadmin”을 참고한다.

5.5.2. WebAdmin에 의한 관리

JEUS WebAdmin은 웹 브라우저를 통해 JEUS 전체를 설정, 관리 및 모니터링하는 기능을 제공한다.

JEUS MQ 서버는 JEUS의 JMS 엔진이므로(“5.1. 서버 구조” 참고) JEUS WebAdmin을 통한 관리가 가능하다. 특히 WebAdmin은 콘솔 툴에 비해 서로 연관된 복잡한 옵션을 설정하기 쉽고, 다양한 기능을 제공하며 사용 방법 또한 직관적이라는 장점을 갖는다.

다음은 WebAdmin의 사이트 맵 트리의 일부분을 보여준다. WebAdmin에서 아래에 굵게 표시한 트리 노드를 따라가면 JEUS MQ 서버를 설정, 모니터링 및 관리할 수 있는 WebAdmin 페이지가 나타난다.

  • <node-name>

    • 엔진 컨테이너

      • <container-name>

        • 엔진

          • EJB 엔진

          • 서블릿 엔진

          • JMS 엔진

          • 웹 서버 엔진

        • 어플리케이션 모듈

        • 리소스

          • JDBC

          • JMS

            • Connection Factory

            • Destination

            • 클라이언트

          • JCA 리소스

          • 트랜잭션

        • 서비스

    • . . .

참고

JEUS WebAdmin에 대한 기본적인 설명은 "JEUS WebAdmin 안내서"를 참고한다. JEUS MQ 서버 관련 WebAdmin 페이지의 사용 방법은 WebAdmin이 제공하는 온라인 도움말에서 찾을 수 있다.