WebT HMS
본 장에서는 WebT를 이용하여 Tmax에 제공되는 HMS(Hybrid Messaging System)에 접속하여 메시징 서비스를 이용하는 방법에 대해 설명한다.
1. 개요
메시징 시스템은 송신자와 수신자 사이의 느슨한 결합을 가능케 하는 통신 매개체이다. 각각 보내고 받을 메시지가 머무르는 채널에 대한 정보만을 사용하여 통신을 하는 느슨한 결합이 가능한 통신 매개체로 송신자와 수신자는 가상의 채널에 대한 정보만을 사용해서 상호 통신이 가능하다. Tmax는 HMS를 제공하여, Tmax 서버에서 설정을 통해 메시징 시스템의 접속 채널을 기동할 수 있다.
WebT에서 HMS로의 접속 및 메시지 송수신을 위한 모든 동작은 Sun Microsystems에서 제정한 Java 기반의 메시징 시스템 표준인 Java Messaging Service(이하 JMS)에 의해 정의된 인터페이스에 의해 이루어진다. WebT에서는 JMS 인터페이스를 사용하는 클래스를 제공하므로 사용자는 JMS에서 정의되어 있는 클래스와 함수를 사용하는 것으로 HMS를 이용한 Tmax 서버와의 메시지 송수신을 구현하는 것이 가능하다.
Tmax에서의 HMS 구조에 대한 자세한 내용은 "Tmax HMS User Guide"를 참고한다. |
2. JMS API
JMS에 정의된 클래스들의 역할은 다음과 같다.
-
ConnectionFactory
-
사용자가 JMS를 사용하기 위해 접근하는 최상위 클래스로 메시징 시스템에 접속하는 연결을 생성한다.
-
WebT에서는 WebtConnectionGroup 클래스가 ConnectionFactory 클래스의 역할을 한다. 기존의 방식대로 설정된 환경으로부터 얻어온 WebtConnectionGroup을 ConnectionFactory로 캐스팅하면 WebT에서 ConnectionFactory를 사용할 수 있다.
-
하위 클래스: QueueConnectionFactory, TopicConnectionFactory, XAQueueConnectionFactory, XATopicConnectionFactory
-
-
Connection
-
메시징 시스템에 접속되어 있는 연결을 의미한다.
-
여기에서는 메시지 송수신 과정의 트랜잭션을 관리할 수 있는 세션을 생성한다.
-
하위 클래스: QueueConnection, TopicConnection, XAQueueConnection, XATopicConnection
-
-
Session
-
트랜잭션 단위를 처리할 수 있는 메시징 시스템과의 접속 컨텍스트이다.
-
메시지 송수신에 필요한 주요 클래스인 클라이언트, 메시지, 목적지를 생성한다.
-
하위 클래스: QueueSession, TopicSession, XAQueueSession, XATopicSession
-
-
MessageProducer
-
메시지를 생성하고 송신하는 클라이언트이다.
-
하위 클래스: QueueSender, TopicPublisher
-
-
MessageConsumer
-
메시지를 수신하는 클라이언트이다.
-
하위 클래스: QueueReceiver, TopicSubscriber
-
-
QueueBrowser
-
Queue 형태의 목적지에 한정하는 수신자로 메시지를 소비하지 않고 메시지를 조회할 수 있는 클라이언트이다.
-
-
Destination
-
메시지가 머무는 메시징 시스템의 채널로 Queue와 Topic의 2가지 형태가 있다.
-
하위 클래스: Queue, Topic
-
-
Message
-
송수신되는 메시지를 의미하며 여러 가지 형태를 제공한다.
-
하위 클래스: BytesMessage, MapMessage, ObjectMessage, StreamMessage, TextMessage
-
WebT JMS 지원
현재 WebT는 다음과 같은 클래스를 지원하고 있다.
-
Connection
-
하위클래스 : QueueConnection, TopicConnection, XAConnection, XAQueueConnection, XATopicConnection
-
다음 항목을 제외한 모든 메소드를 지원한다.
ConnectionConsumer createConnectionConsumer(Destination destination, String messageSelector, ServerSessionPool sessionPool, int maxMessages)
ConnectionConsumer createDurableConnectionConsumer(Topic topic, String subscriptionName, String messageSelector, ServerSessionPool sessionPool, int maxMessages)
-
-
ConnectionFactory
-
하위클래스 : QueueConnectionFactory, TopicConnectionFactory, XAQueueConnectionFactory, XATopicConnectionFactory
-
모든 메소드를 지원한다.
-
-
Session, QueueSession, TopicSession, XASession, XAQueueSessin, XATopicSession
-
모든 메소드를 지원한다.
-
-
MessageProducer, QueueSender, TopicPublisher
-
모든 메소드를 지원한다.
-
-
MessageConsumer, QueueReceiver, TopicSubscriber
-
모든 메소드를 지원한다.
-
-
QueueBrowser
-
모든 메소드를 지원한다.
-
-
Message, BytesMessage, TextMessage, MapMessage, StreamMessage, ObjectMessage
-
모든 메소드를 지원한다.
-
-
MessageListener
-
사용자 구현 인터페이스를 지원한다.
-
-
ExceptionListener
-
사용자 구현 인터페이스를 지원한다.
-
각 클래스 및 메소드들의 정확한 의미에 대해서는 http://java.sun.com/j2ee/1.4/docs/api/javax/jms/package-tree.html를 참고한다. |
3. 환경설정
Tmax의 HMS에 접속하려면 Tmax의 환경설정을 통해 HMS를 구동하고, WebT에서 생성한 Connection Group을 HMS에 접속할 수 있도록 webt.properties 파일이나 JEUS의 JeusMain.xml 파일에 HMS 관련 설정을 해야 한다.
3.1. Tmax 설정
HMS를 사용하려면 Tmax 환경 파일의 DOMAIN, NODE, SVRGROUP, HMS 절에 대한 설정이 필요하다.
다음은 HMS를 사용하는 환경 파일의 예제이다.
*DOMAIN Domain1 SHMKEY=0x11936, TMMLOGLVL = "DEBUG1", CLHLOGLVL = "DEBUG1", MINCLH = 1, MAXCLH = 1, TPORTNO = 7783, MAXSESSION = 1024 *NODE Node1 TMAXDIR = "/data/tmax", APPDIR = "/data/tmax/appbin/", MAXSESSION = 1024 *SVRGROUP svghms NODENAME = "node1", CPC=1, SVGTYPE="HMS", RESTART=N, OPENINFO = "ORACLE_XA+Acc=P/scott/tiger+SesTm=60+Threads=true", HMSSUBSCFG = "/data/tmax/config/hmssubsconfig", HMSNAME = "hms_ora", HMSSINDEX = 1, HMSMSGLIVE = 1, HMSMAXTHR = 4, HMSMAXDBTHR = 10 *SERVER … *SERVICE … *HMS queue1 SVGNAME = svghms, TYPE = "QUEUE", BOOT = "WARM", GLOBAL = N topic1 SVGNAME = svghms, TYPE = "TOPIC", BOOT = "WARM", GLOBAL = N
-
DOMAIN 절, NODE 절
MAXSESSION 항목의 설정이 가능하다.
-
SVRGROUP 절
SVRGROUP, NODENAME, SVGTYPE, HMSNAME, OPENINFO, HMSINDEX, HMSMAXTHR, HMSMAXDBTHR 항목에 대한 설정이 필요하다. HMSSUBSCFG, HMSMSGLIVE, HMSPORT, HMSHEARTBEAT, HMSGQINT 항목의 설정이 가능하다.
-
HMS 절
SVRNAME, TYPE 항목에 대한 설정이 필요하다. BOOT, GLOBAL, GQTHR, GQMAXREQ, GQFULL 항목의 설정이 가능하다.
각 설정에 대한 자세한 내용은 "Tmax HMS User Guide"의 "제2장 HMS 환경설정"을 참고한다. |
3.2. JEUSMain.xml 설정
JEUS의 환경 파일인 JEUSMain.xml에 <external-resource>로 설정하는 WebtConnectionPool에 HMS 설정을 추가하면 HMS에 접속할 수 있다.
다음은 JEUSMain.xml을 설정하는 예제이다.
<resource> ... <external-resource> <property-group> <name-prefix>tmax2</name-prefix> <property> <key>type</key> <value>shared</value> </property> <property> <key>host-name</key> <value>192.168.35.218</value> </property> <property> <key>host-port</key> <value>8888</value> </property> <property> <key>min</key> <value>10</value> </property> <property> <key>max</key> <value>20</value> </property> <property> <key>step</key> <value>2</value> </property> <property> <key>check-acquired</key> <value>true</value> </property> <property> <key>support-xa</key> <value>true</value> </property> <property> <key>enable-autoclose</key> <value>true</value> </property> <property> <key>connect-timeout</key> <value>2</value> </property> <propery> <key>jms-name</key> <value>hms01</value> </property> <propery> <key>jms-type</key> <value>queue</value> </property> </property-group> </external-resource> ... </resource>
다음은 HMS 설정과 관련된 항목에 대한 설명이다.
항목 | 구분 | 설명 |
---|---|---|
jms-name |
설정값 |
String |
기본값 |
NULL |
|
설명 |
Tmax의 HMS 서비스를 이용하기 위한 HMS명을 지정한다. 이 값이 지정되었을 경우 Java 메시징 시스템의 인터페이스를 이용하여 해당 Connection Pool로부터 Tmax의 HMS에 접속할 수 있다. |
|
jmsType |
설정값 |
queue | topic | xaqueue | xatopic |
기본값 |
NULL |
|
설명 |
접속하는 메시징 시스템의 타입을 결정한다. jms-name이 지정되었을 경우에만 유효하다. |
3.3. webt.properties 설정
webt.properties에 다음 항목을 설정하면 WebT에서 HMS에 접속할 수 있다.
다음은 webt.properties를 설정하는 예제이다.
####################################### # logging related parameters. ####################################### # set log level valid values are none, info, debug. default is none. log.level=debug # set directory in which the log file places. if not set, log is # printed to standard out log.dir=D:\\ # set the name of the log file. default is webt.log log.file=webt.log # set log buffering size. default is 0 log.bufsize=1024 # tmax.webt.xid.log=true ####################################### # FDL related parameters ####################################### # set the fdl file. fdl.file=c:\\tmax\\sample\\fdl\\tmax.fdl # set application wide default character set. default is system default defaultCharset=euc-kr # Tmax headerType headerType=extendedV4 ############################## # monioring related parameters ############################## # enable/disable alive check. default is disable(false) monitoring.pool.checkAlive=true # set monitoring interval. default is 60sec monitoring.pool.interval=5 # set monitoring log file valid-days.default is -1 monitoring.log.validDays=1 ############################## # connection pool realted paramters ############################## # enable/disable connection pool. default is disable(false) enableConnectionPool=true # WebtConnectionGroup name list connectionPool.groups=tmax1 # set connection group type valid values are shared, non-shared, # non-shared2. default is shared connectionPool.tmax1.type=shared # set Tmax Server Address. connectionPool.tmax1.hostAddr=192.168.1.123 # set Tmax Server Port. connectionPool.tmax1.hostPort=8888 # set Backup Tmax Server Address. connectionPool.tmax1.hostBackupAddr=61.77.153.1 # set Backup Tmax Server Port. connectionPool.tmax1.hostBackupPort=8889 # set default user name for security. connectionPool.tmax1.userName=tmax # set default user passward for security. connectionPool.tmax1.userPasswd=1234 # set default domain name for security. connectionPool.tmax1.domainName=choco # set default domain passward for security. connectionPool.tmax1.domainPasswd=1234 # set initial pool size. default is 10 connectionPool.tmax1.initCapacity=1 # set max pool size. default is 20 connectionPool.tmax1.maxCapacity=10 # set increment step size. default is 5 connectionPool.tmax1.incrementRate=2 # set connection idle time. default is 60sec connectionPool.tmax1.maxIdleTime=60 # set tptimeout. connectionPool.tmax1.tpTimeout=40 # set txtimeout. connectionPool.tmax1.txTimeout=10 # set connection timeout. connectionPool.tmax1.connectTimeout=10 # enable to event service. #connectionPool.tmax1.enableEvent=true # set event service Type. #connectionPool.tmax1.eventSvcType=all # set event handler object. #connectionPool.tmax1.eventHandler=tcpservet.event.GenericEvent jeus.servlet.webt.autoClose.enable=true connectionPool.tmax1.jmsName = hms01 connectionPool.tmax1.jmsType = queue
다음은 HMS 설정과 관련된 항목에 대한 설명이다.
-
connectionPool.<groupName>.jmsName = String
-
기본값 : NULL
-
Tmax의 HMS 서비스를 이용하기 위한 HMS명을 지정한다. 이 값이 지정되었을 경우 Java 메시징 시스템의 인터페이스를 이용하여 해당 Connection Pool로부터 Tmax의 HMS에 접속할 수 있다.
-
-
connectionPool.<groupName>.jmsType = queue | topic | xaqueue | xatopic
-
기본값 : NULL
-
접속하는 메시징 시스템의 타입을 결정한다. jms-name이 지정되었을 경우에만 유효하다.
-
4. 프로그램 예제
다음은 WebT에서 HMS를 사용하는 Java 프로그램의 예제이다.
public class JmsTest1 { public static void main(String[] argv) throws Exception{ System.setProperty("webt.properties", "d:\\webt.properties"); new WebtProperties(); QueueConnectionFactory result = (QueueConnectionFactory)WebtConnectionPool.getGroup("tmax1"); QueueSession qc = (QueueSession)(((QueueConnectionFactory)result).createQueueConnection().createQueueSession(false, Session.AUTO_ACKNOWLEDGE)); Queue q = qc.createQueue("queue01"); QueueSender qs = (QueueSender)(qc.createSender(q)); QueueSender qs2 = (QueueSender)(qc.createSender(q)); System.out.println("qs2 id : " + ((WebtQueueSender)qs2).getID()); TextMessage msg = qc.createTextMessage(); msg.setText("qwerty"); msg.setIntProperty("NO", 1); qs.send(msg,DeliveryMode.PERSISTENT,0,0); QueueReceiver qr = (QueueReceiver)(qc.createReceiver(q)); BytesMessage msg2 = (BytesMessage)(qr.receive()); byte[] data = new byte[256]; msg2.readBytes(data); System.out.println("body : " + new String(data)); System.out.println("NO : " + msg2.getIntProperty("NO")); qr.close(); qs.close(); //qs2.close(); qc.close(); }