제12장 JAX-WS JMS Transport

내용 목차

12.1. 개요
12.2. JAX-WS JMS 기반 전송 사용
12.2.1. JMS 서버 설정
12.2.2. JAX-WS JMS 기반 전송을 사용하는 웹 서비스 작성
12.2.3. WSDL에 JAX-WS JMS 기반 전송을 위한 wsdl:port 설정
12.2.4. JAX-WS JMS 기반 전송을 사용하는 웹 서비스 클라이언트 작성

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

12.1. 개요

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

12.2. JAX-WS JMS 기반 전송 사용

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

12.2.1. JMS 서버 설정

JAX-WS JMS 기반 전송은 JMS 서버를 기반으로 JMS 서버가 제공하는 ConnectionFactory와 Destination을 사용하여 동작한다. JAX-WS JMS 기반 전송을 사용하기 위해서는 JEUS MQ 서버의 JMSMain.xml에 JAX-WS JMS 기반 전송이 사용할 ConnectionFactory와 Destination 설정을 해야 한다.

JAX-WS JMS 기반 전송은 Destination으로 Queue 타입을 사용한다. 자세한 설정 방법은 "JEUS MQ 안내서"를 참고한다.

예제에서는 다음과 같은 설정을 사용한다.

[예 12.1] << JMSMain.xml >>

<jms-server xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    ...
    <connection-factory>
        <type>queue</type>
        <name>QueueConnectionFactory</name>
        <service>jmstest</service>
    </connection-factory>
    <destination>
        <type>queue</type>
        <name>ExamplesQueue</name>
        <multiple-receiver>true</multiple-receiver>
    </destination>
    ...
</jms-server>


12.2.2. JAX-WS JMS 기반 전송을 사용하는 웹 서비스 작성

HTTP 대신에 JMS 기반 전송을 사용하기 위해서는 @jeus.webservices.jaxws.api.JMSWebService Annotation을 웹 서비스 Endpoint에 더한다. @JMSWebService Annotation은 connectionFactory, destination, portName 속성을 갖는다.

[표 12.1] JMSWebService의 속성

속성설명기본값
connectionFactoryJMS Server의 ConnectionFactory 이름으로 JMSMain.xml#<connection-factory>/<name> 값과 일치해야 한다.""
destinationJMS Server의 destination 이름으로 JMSMain.xml#<destination>/<name> 값과 일치해야 한다.""
portNamefromJava 모델에서는 published WSDL에 공개될 port 이름이다.""

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

[예 12.2] << AddNumbersImpl.java >>

@WebService
@jeus.webservices.jaxws.api.JMSWebService(
    connectionFactory = "QueueConnectionFactory",
    destination = "ExamplesQueue",
    portName = "AddNumbersJMSPort")
public class AddNumbersImpl {
...


@JMSWebService#portName 속성이 명시되지 않으면, JAX-WS JMS 기반 전송을 위한 portName은 “JMSTransport” + default_PortName으로 설정된다. 예를 들어, 위에서 portName을 설정하지 않으면 portName은 "JMSTransportAddNumbersImplPort"가 된다.

12.2.3. WSDL에 JAX-WS JMS 기반 전송을 위한 wsdl:port 설정

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

예제에서는 다음 설정을 사용한다.

[예 12.3] << AddNumbers.wsdl >>

<definitions name="AddNumbers" targetNamespace="urn:AddNumbers" ... >
    ...
    <service name="AddNumbersService">
    <port name="AddNumbersPort" binding="impl:AddNumbersBinding">
        <soap:address location="REPLACE_WITH_ACTUAL_URL" />
    </port>
    <port name="AddNumbersJMSPort" binding="impl:AddNumbersBinding">
        <soap:address location="REPLACE_WITH_ACTUAL_URL" />
    </port>
    </service>
</definitions>


또한, wsdl:port에 설정된 JMS 기반 전송을 위한 port 이름은 웹 서비스 Endpoint의 @JMSWebService#portName 속성 값과도 일치해야 한다.

12.2.4. JAX-WS JMS 기반 전송을 사용하는 웹 서비스 클라이언트 작성

JAX-WS JMS 기반 전송을 사용하려는 웹 서비스 클라이언트는 기존의 HTTP 기반의 port 대신에 JMS 기반의 port를 사용하여 JMS를 통해서 웹 서비스를 호출할 수 있다(JMS 기반 전송을 사용하는). 웹 서비스의 공개된(published) WSDL은 JMS 기반 전송을 위한 wsdl:port을 가지고 있다. 이 WSDL로부터 JEUS 웹 서비스의 wsimport 도구로 생성된 Service(extends javax.xml.ws.Service) 클래스는 기존의 HTTP 기반의 port를 얻기 위한 메소드뿐만 아니라, JMS 기반의 port를 얻기 위한 메소드도 가지고 있다.

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

[예 12.4] << AddNumbersClient.java >>

//AddNumbersPortType port = new AddNumbersService().getAddNumbersPort();
AddNumbersPortType port = new AddNumbersService().getAddNumbersJMSPort();
...