본 장에서는 웹 서비스에서 JAX-WS JMS 기반 전송(JMS Transport)을 사용하는 방법에 대해 설명한다.
기본적으로 웹 서비스 클라이언트 애플리케이션은 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를 선택하여 웹 서비스를 호출할 수 있다.
본 절에서는 개발자가 JAX-WS 웹 서비스와 JMS에 익숙하다고 가정하고, JAX-WS JMS 기반 전송을 설정하는 방법을 설명한다.
JAX-WS JMS 기반 전송은 JMS 서버가 제공하는 ConnectionFactory와 Destination을 사용해서 동작한다. Destination으로 Queue 타입을 사용한다. JEUS 도메인 서버의 domain.xml 파일에 <connection-factory>, <destination>을 설정한다. 자세한 설정 방법은 "JEUS MQ 안내서"를 참고한다.
다음은 JAX-WS JMS 기반 전송 설정에 대한 예제이다.
[예 12.1] 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>
HTTP 대신에 JMS 기반 전송을 사용하기 위해서는 @jeus.webservices.jaxws.api.JMSWebService Annotation을 웹 서비스 Endpoint에 추가한다.
@JMSWebService Annotation이 설정된 웹 서비스 Endpoint는 다음과 같다.
[예 12.2] 웹 서비스 Endpoint : <AddNumbersImpl.java>
@WebService @jeus.webservices.jaxws.api.JMSWebService( jndiConnectionFactoryName = "QueueConnectionFactory", destinationName = "ExamplesQueue", targetService = "AddNumbersImplService") public class AddNumbersImpl { ...
JMSWebService의 속성은 다음과 같다.
속성 | 설명 |
---|---|
JMS 서버의 ConnectionFactory 이름으로 domain.xml#<connection-factory>/<name> 값과 일치해야 한다. | |
JMS 서버의 Destination 이름으로 domain.xml#<destination>/<name> 값과 일치해야 한다. | |
Destination에 도착한 메시지를 전달할 서비스 Endpoint 구현체를 나타낸다. fromJava 모델에서 속성이 명시되지 않으면, wsdl:service 이름을 targetService 속성값으로 사용한다. fromWSDL 모델에서 JMS URI의 targetService 속성값과 일치해야 한다. |
웹 서비스 Endpoint를 WSDL로부터 생성한다면 배치할 애플리케이션(WAR 또는 JAR)에 포함되는 WSDL에는 HTTP를 사용하는 wsdl:port와 JMS 기반 전송을 위한 wsdl:port가 설정되어 있어야 한다.
다음은 WSDL에 JAX-WS JMS 기반 전송을 위한 wsdl:port의 soap:address에 JMS URI를 설정하는 예제이다.
[예 12.3] 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 속성값과 일치해야 한다.
JAX-WS JMS 기반 전송을 사용하려는 웹 서비스 클라이언트는 기존의 HTTP 기반의 포트 대신에 JMS 기반의 포트를 사용하여 웹 서비스를 호출할 수 있다.
웹 서비스의 공개된(Published) WSDL은 JMS 기반 전송을 위한 wsdl:port을 가지고 있다. 이 WSDL로부터 JEUS 웹 서비스의 wsimport 도구로 생성된 Service(extends javax.xml.ws.Service) 클래스는 기존의 HTTP 기반의 포트를 얻기 위한 메소드뿐만 아니라 JMS 기반의 포트를 얻기 위한 메소드도 가지고 있다.
웹 서비스 클라이언트 애플리케이션은 다음과 같이 사용할 타입의 포트를 선택하여 웹 서비스를 호출할 수 있다.
[예 12.4] 웹 서비스 클라이언트 : <AddNumbersClient.java>
//AddNumbersPortType port = new AddNumbersService().getAddNumbersPort(); AddNumbersPortType port = new AddNumbersService().getAddNumbersJMSPort(); ...