본 장에서는 신뢰성 메시징 기술에 대한 개념과 설정 방법에 대해서 설명한다.
신뢰성 메시징은 더욱더 신뢰성 있는 웹 서비스를 위한 양질의 서비스(Quality of Service, QOS)를 위함이다. 신뢰성은 하나의 지점으로부터 다른 하나의 지점으로 메시지를 전달할 수 있는 능력에 의해 측정될 수 있다. 이러한 신뢰성 메시징은 웹 서비스의 양 끝단에서 애플리케이션 메시지들의 전달을 보장하는 것이 주요 목적이다.
신뢰성 메시징 기술(WS-Reliable Messaging)은 메시지가 전달되지 못한 경우에 이를 복구하는 기술로 어떤 메시지들이 오직 한 번만 부과적으로는 순서에 맞게 웹 서비스의 양 끝단에 전달되는 것을 보장한다. 메시지가 중간에서 사라졌다면 메시지를 보낸 시스템은 이를 받아들이는 시스템으로부터 확인(Acknowledge) 메시지를 받을 때까지 그 메시지를 재전송하고, 받아들이는 시스템에서 메시지들이 순서에 맞게 들어오지 않았다면 이를 순서에 맞게 다시 수정해서 웹 서비스 Endpoint에 전달하게 된다.
이러한 신뢰성 메시징에 관한 스펙으로는 다음과 같은 것들이 있다.
다음과 같은 문제점들이 발생할 경우에는 신뢰성 메시징 기술의 사용을 고려해야 한다.
통신 실패(Communication failure)가 발생하여 네트워크(Unavailable network)가 연결되지 않거나 연결의 끊김(Connection drop)이 현상이 발생하는 경우
애플리케이션 메시지가 전송 도중 사라지는 경우
순서에 맞게 전송되는 애플리케이션 메시지를 요구하는 경우인데 순서에 맞게 전송되지 않는 경우
신뢰성 메시징 기술을 사용할 것인지를 고려할 때 다음과 같은 장단점들 비교해봐야 한다.
신뢰성 메시징은 소스로부터 목적지까지 단 한 번만 전송되는 것을 의미한다. 만약 순서에 맞게 전송되는 옵션을 선택한 경우 그 메시지는 순서에 맞게 전송된다.
신뢰성 메시징으로 웹 서비스의 메시지를 전송하는 경우 이는 전체 웹 서비스의 성능을 저하시킬 수 있다. 특히 순서에 맞게 전송되는 옵션일 경우에 더 심하다.
신뢰성 메시징을 사용하지 않는 클라이언트는 이를 사용하는 웹 서비스와 상호 운용할 수 없다.
서버의 WS-Reliable Messaging 설정은 WSDL로부터 구현할 수도 있고, Java 클래스로부터 설정할 수도 있다.
WS-Reliable Messaging을 WSDL로부터 구현하기 위해서는 웹 서비스 Addressing의 경우와 마찬가지로 WSDL 문서에 웹 서비스 정책을 설정하고 wsimport 툴을 사용하여 웹 서비스를 생성한다.
WSDL 파일에 WS-Reliable Messaging을 웹 서비스 정책을 설정하는 방법은 다음과 같다.
기본적으로 PolicyAssertion에 다음을 설정한다.
<wsrm:RMAssertion xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy" />
순서에 맞는 전송(inorder)을 보장받기 위해서는 PolicyAssertion에 다음을 설정한다.
<rmp:Ordered xmlns:rmp="http://sun.com/2006/03/rm" />
다음은 이와 같이 구성한 WSDL 파일의 예이다.
[예 15.1] 서버의 WS-Reliable Messaging 설정 : << AddNumbers.wsdl >>
<?xml version="1.0" ?> <definitions name="AddNumbers" targetNamespace="http://example.org" xmlns:tns="http://example.org" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/ oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"> <wsp:UsingPolicy /> <wsp:Policy wsu:Id="AddNumbers_policy"> <wsp:ExactlyOne> <wsp:All> <wsaw:UsingAddressing /> <wsrm:RMAssertion> <wsrm:InactivityTimeout Milliseconds="600" /> <wsrm:AcknowledgementInterval Milliseconds="200" /> </wsrm:RMAssertion> </wsp:All> </wsp:ExactlyOne> </wsp:Policy> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://example.org"> <element name="addNumbersResponse" type="tns:addNumbersResponse" /> <complexType name="addNumbersResponse"> <sequence> <element name="return" type="xsd:int" /> </sequence> </complexType> <element name="addNumbers" type="tns:addNumbers" /> <complexType name="addNumbers"> <sequence> <element name="arg0" type="xsd:int" /> <element name="arg1" type="xsd:int" /> </sequence> </complexType> </xsd:schema> </types> <message name="addNumbers"> <part name="parameters" element="tns:addNumbers" /> </message> <message name="addNumbersResponse"> <part name="result" element="tns:addNumbersResponse" /> </message> <portType name="AddNumbersPortType"> <operation name="addNumbers"> <input message="tns:addNumbers" name="add" /> <output message="tns:addNumbersResponse" name="addResponse" /> </operation> </portType> <binding name="AddNumbersBinding" type="tns:AddNumbersPortType"> <wsp:PolicyReference URI="#AddNumbers_policy" /> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="addNumbers"> <soap:operation soapAction="" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="AddNumbersService"> <port name="AddNumbersPort" binding="tns:AddNumbersBinding"> <soap:address location="REPLACE_WITH_ACTUAL_URL" /> </port> </service> </definitions>
Java 클래스로부터 WS-Reliable Mesaaging을 설정하기 위해서는 다음과 같이 wsgen 툴의 -policy 기능을 이용하여 wsit-endpoint.xml을 먼저 얻어야 한다.
$ wsgen fromjava.server.AddNumbersImpl -d web/WEB-INF -policy service-config.xml
다음은 service-config.xml의 내용이다.
[예 15.2] Java 클래스의 WS-Reliable Messaging 설정 : << service-config.xml >>
<?xml version="1.0" encoding="UTF-8"?> <web-services-config xmlns="http://www.tmaxsoft.com/xml/ns/jeus"> <policy> <endpoint-policy-subject> <addressing-policy/> <rm-policy> <inactivityTimeout>600000</inactivityTimeout> <acknowledgementInterval>1000</acknowledgementInterval> </rm-policy> </endpoint-policy-subject> </policy> </web-services-config>
WS-Reliable Messaging을 위한 클라이언트의 추가적인 설정은 필요하지 않다. JEUS 웹 서비스는 클라이언트의 런타임에 원격 웹 서비스 WSDL의 WS-Reliable Messaging 정책을 해석해서 자동으로 WS-Reliable Messaging을 위한 환경을 제공한다.
Java 클래스로부터의 구현은 wsit-endpoint.xml이라는 DD 파일이 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된다는 사실을 제외하고 기본적인 JEUS 8 웹 서비스와 동일하다.
다음은 service-config.xml 파일의 예이다.
[예 15.3] WS-Reliable Messaging 설정 : << service-config.xml >>
<?xml version="1.0" encoding="UTF-8"?> <web-services-config xmlns="http://www.tmaxsoft.com/xml/ns/jeus"> <policy> <endpoint-policy-subject> <addressing-policy/> <rm-policy> <inactivityTimeout>600000</inactivityTimeout> <acknowledgementInterval>1000</acknowledgementInterval> </rm-policy> </endpoint-policy-subject> </policy> </web-services-config>
위의 service-config.xml 파일을 가지고 wsgen을 통해 웹 서비스를 생성하기 위해서는 다음과 같이 입력한다.
$ ant build
웹 서비스가 정상적으로 생성되었다면 다음과 같은 구조를 갖게 된다.
web | +-- WEB-INF | +-- wsit-fromjava.server.AddNumbersImpl.xml +-- classes | +-- fromjava.server.AddNumbersImpl
wsit-fromjava.server.AddNumbersImpl.xml 파일은 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된 것이다.
서비스를 deploy하기 위해 다음과 같이 실행한다.
$ ant deploy
웹 서비스가 정상적으로 deploy되면 이를 사용하는 클라이언트를 다음과 같이 생성하고 서비스를 호출한다.
$ ant run ... run: [java] ########################################## [java] ### JAX-WS Webservices examples - wsit ### [java] ########################################## [java] Testing wsit webservices... [java] Success! ... BUILD SUCCESSFUL