JAX-WS JMS 기반 전송

본 장에서는 웹 서비스에서 JAX-WS JMS 기반 전송(JMS Transport)을 사용하는 방법에 대해 설명한다.

1. 개요

기본적으로 웹 서비스 클라이언트 애플리케이션은 JEUS 웹 서비스를 호출할 때 전송 프로토콜로서 HTTP를 사용하지만, JEUS JAX-WS에서는 JMS 기반 전송을 사용하여 웹 서비스를 호출할 수 있다.

JAX-WS JMS 기반 전송은 JEUS MQ 서버의 ConnectionFactory와 Destination 설정을 사용한다. JAX-WS JMS 기반 전송을 사용하는 웹 서비스는 @jeus.webservices.jaxws.api.JMSWebService Annotation을 웹 서비스 Endpoint에 추가한다.

JAX-WS JMS 기반 전송을 사용하는 웹 서비스가 배치되면 공개된 WSDL에는 2개의 wsdl:port가 정의된다(HTTP 기반의 Port와 JMS 기반의 Port). 웹 서비스 클라이언트 애플리케이션은 사용하기 원하는 타입의 Port를 선택하여 웹 서비스를 호출할 수 있다.

2. JAX-WS JMS 기반 전송 설정

본 절에서는 개발자가 JAX-WS 웹 서비스와 JMS에 익숙하다고 가정하고, JAX-WS JMS 기반 전송을 설정하는 방법을 설명한다.

2.1. JMS 서버 설정

JAX-WS JMS 기반 전송은 JMS 서버가 제공하는 ConnectionFactory와 Destination을 사용해서 동작한다. Destination으로 Queue 타입을 사용한다. JEUS 도메인 서버의 domain.xml 파일에 <connection-factory>, <destination>을 설정한다. 자세한 설정 방법은 JEUS MQ 안내서를 참고한다.

다음은 JAX-WS JMS 기반 전송 설정에 대한 예제이다.

JMS 서버 설정 : <domain.xml>
<jms-engine xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    ...
    <connection-factory>
        <type>queue</type>
        <name>QueueConnectionFactory</name>
        <service>jmstest</service>
    </connection-factory>
    ...
</jms-engine>
<jms-resource>
    ...
    <destination>
        <type>queue</type>
        <name>ExamplesQueue</name>
        <multiple-receiver>true</multiple-receiver>
    </destination>
    ...
</jms-resource>

2.2. 웹 서비스 작성

HTTP 대신에 JMS 기반 전송을 사용하기 위해서는 @jeus.webservices.jaxws.api.JMSWebService Annotation을 웹 서비스 Endpoint에 추가한다.

@JMSWebService Annotation이 설정된 웹 서비스 Endpoint는 다음과 같다.

웹 서비스 Endpoint : <AddNumbersImpl.java>
@WebService
@jeus.webservices.jaxws.api.JMSWebService(
    jndiConnectionFactoryName = "QueueConnectionFactory",
    destinationName = "ExamplesQueue",
    targetService = "AddNumbersImplService")
public class AddNumbersImpl {
...

JMSWebService의 속성은 다음과 같다.

속성 설명

jndiConnectionFactoryName

JMS 서버의 ConnectionFactory 이름으로 domain.xml#<connection-factory>/<name> 값과 일치해야 한다.

destinationName

JMS 서버의 Destination 이름으로 domain.xml#<destination>/<name> 값과 일치해야 한다.

targetService

Destination에 도착한 메시지를 전달할 서비스 Endpoint 구현체를 나타낸다.

fromJava 모델에서 속성이 명시되지 않으면, wsdl:service 이름을 targetService 속성값으로 사용한다.

fromWSDL 모델에서 JMS URI의 targetService 속성값과 일치해야 한다.

2.3. WSDL 설정

웹 서비스 Endpoint를 WSDL로부터 생성한다면 배치할 애플리케이션(WAR 또는 JAR)에 포함되는 WSDL에는 HTTP를 사용하는 wsdl:port와 JMS 기반 전송을 위한 wsdl:port가 설정되어 있어야 한다.

다음은 WSDL에 JAX-WS JMS 기반 전송을 위한 wsdl:port의 soap:address에 JMS URI를 설정하는 예제이다.

WSDL 설정 : <AddNumbers.wsdl>
<definitions name="AddNumbers" targetNamespace="urn:AddNumbers" ... >
    ...
    <service name="AddNumbersService">
    <port name="AddNumbersPort" binding="impl:AddNumbersBinding">
        <soap:address location="http://<host>:<port>/<context>/AddNumbersService" />
    </port>
    <port name="AddNumbersJMSPort" binding="impl:AddNumbersBinding">
        <soap:address location="jms:jndi:ExamplesQueue?targetService=AddNumbersImplService&jndiConnectionFactoryName=QueueConnectionFactory" />
    </port>
    </service>
</definitions>

SOAP/JMS의 JMS URI은 'SOAP over Java Message Service 1.0' 표준에 따라 설정해야 한다.

JMS URI는 "jms" scheme을 사용하고, JMS destination을 JNDI로 조회할 destination 이름을 명시한다. JMS URI의 targetService 속성은 웹 서비스 Endpoint의 @JMSWebService#targetService 속성값과 일치해야 한다.

2.4. 웹 서비스 클라이언트 작성

JAX-WS JMS 기반 전송을 사용하려는 웹 서비스 클라이언트는 기존의 HTTP 기반의 포트 대신에 JMS 기반의 포트를 사용하여 웹 서비스를 호출할 수 있다.

웹 서비스의 공개된(Published) WSDL은 JMS 기반 전송을 위한 wsdl:port을 가지고 있다. 이 WSDL로부터 JEUS 웹 서비스의 wsimport 도구로 생성된 Service(extends javax.xml.ws.Service) 클래스는 기존의 HTTP 기반의 포트를 얻기 위한 메소드뿐만 아니라 JMS 기반의 포트를 얻기 위한 메소드도 가지고 있다.

웹 서비스 클라이언트 애플리케이션은 다음과 같이 사용할 타입의 포트를 선택하여 웹 서비스를 호출할 수 있다.

웹 서비스 클라이언트 : <AddNumbersClient.java>
//AddNumbersPortType port = new AddNumbersService().getAddNumbersPort();
AddNumbersPortType port = new AddNumbersService().getAddNumbersJMSPort();
...