WebTJCA Inbound 통신
본 장에서는 WebTJCA Inbound 통신에 대해 설명한다.
1. Inbound 통신
Inbound 통신의 처리 과정은 다음과 같다.
Tmax 리소스 어댑터는 Tmax로부터 웹 애플리케이션 서버에 오는 요청에 대해 어떤 서비스를 호출해야 하는지 알 수 없다. 따라서 중간에 Message Driven Bean을 추가하여 리소스 어댑터가 Message Driven Bean으로 메시지를 전달하고 Message Driven Bean에서는 사용자가 업무에 맞게 해당하는 서비스를 호출할 수 있도록 작성해야 한다. 리소스 어댑터에서 어떤 Message Driven Bean으로 메시지를 전달할지는 다음의 설정에 의해서 정의한다.
ra.xml
ra.xml에 다음과 같이 <activationspec-class>에 com.tmax.connector.spi.TmaxActivationSpec이라고 작성하고 <config-property-name>에는 serviceName이라고 작성하여 설정한다.
<inbound-resourceadapter> <messageadapter> <messagelistener> <messagelistener-type>javax.resource.cci.MessageListener</messagelistener-type> <activationspec> <activationspec-class>com.tmax.connector.spi.TmaxActivationSpec </activationspec-class> <required-config-property> <config-property-name>serviceName</config-property-name> </required-config-property> </activationspec> </messagelistener> </messageadapter> </inbound-resourceadapter>
Message Driven Bean의 ejb-jar.xml
사용자가 개발한 Message Driven Bean에서 ejb-jar.xml에 다음 예제와 같이 <message-destination-link>와 <activation-config>를 입력하고 디플로이를 할 경우 해당하는 리소스 어댑터에 <activation-config-property>를 통지한다. 통지를 받은 Tmax 리소스 어댑터는 serviceName에 입력한 service가 Tmax로부터 요청할 경우 등록된 Message Driven Bean으로 메시지를 전달한다.
<message-destination-link>TmaxRA</message-destination-link> <activation-config> <activation-config-property> <activation-config-property-name>serviceName</activation-config-property-name> <activation-config-property-value>ECHOSTRING,CREATE_ACCOUNT_B,TRANSFER_MONEY_B </activation-config-property-value> </activation-config-property> </activation-config>
2. Worker Thread
Inbound 통신은 설정된 포트를 accept하는 Thread가 기본적으로 하나 생성되며, accept하는 소켓을 read하기 위한 Thread가 소켓당 하나씩 더 생성된다. 이 Thread의 생성 숫자는 애플리케이션 서버의 Worker Manager에 Max 값으로 결정되며 설정은 업체마다 해당하는 설정에 따른다.
Tmax 클라이언트로부터 들어온 요청에 대해 RA의 Acceptor Thread에서 각각의 Worker Thread를 생성한다. 생성된 각각의 Worker Thread에서 해당 요청을 MDB로 전송하면 해당 요청에 대하여 MDB에서 구분하여 처리한다. Tmax의 JAVAGW와 연결해야 한다.
다음은 Inbound 구조를 설명한 그림이다.
3. Message Driven Bean
Message Driven Bean을 작성할 때 사용자는 javax.resource.cci.MessageListener를 구현해야 한다.
다음은 Message Driven Bean을 설정하는 예제이다.
public Record onMessage(Record in) throws ResourceException { String svcName = (String)((MappedRecord)in).get("$ServiceName"); if( svcName.equalsIgnoreCase("echostring") ) { return in; } else if( svcName.equalsIgnoreCase("create_account_b")) { } else if( svcName.equalsIgnoreCase("transfer_money_b")) { } return in; }
-
public Record onMessage(Record in) throws ResourceException
메소드가 리소스 어댑터에서 전달할 때 호출되는 메소드이다. Record는 MappedRecord로 전달한다. 사용자는 특별 키를 사용하여 서비스 이름이나 특정 값을 설정하거나 참고할 수 있다. OnMessage의 반환값이 Tmax에서 요청자에게 전달되는 응답 메시지이다.
사용자는 성공, 실패 여부를 알리기 위해서 다음 예제와 같이 반환값에 $ReturnCode, $UserCode를 입력해야 한다. 성공했을 때는 $ReturnCode를 0으로 설정하고, 실패했을 때는 $ReturnCode를 -1로 설정하고 $UserCode에 Tmax에서 참고할 수 있는 usercode를 입력한다.
// 성공 시 MappedRecord out = (MappedRecord) in.clone(); out.put("$ReturnCode", new Integer(0)); // 실패 시 out.put("$ReturnCode", new Integer(-1)); out.put("$UserCode", new Integer(usrcode));
4. Logging
ra.xml의 <resourceadapter>에서 로그 관련 설정을 할 때 Inbound 작업에 대한 로그를 출력한다.
Inbound 로깅을 설정할 때는 ra.xml에 다음과 같은 설정을 추가한다.
<resourceadapter> <config-property> <config-property-name>name</config-property-name> <config-property-type>java.lang.String</config-property-type> <config-property-value>tmaxin1</config-property-value> </config-property> </resourceadapter>