내용 목차
본 장에서는 신뢰성 메시징 기술에 대한 개념과 설정 방법에 대해서 설명한다.
신뢰성 메시징은 더욱더 신뢰성 있는 웹 서비스를 위한 양질의 서비스(Quality of Service, QOS)를 위함이다. 신뢰성이라는 것은 하나의 지점으로부터 다른 하나의 지점으로 메시지를 전달할 수 있는 능력에 의해 측정될 수 있다. 이러한 신뢰성 메시징은 웹 서비스의 양 끝단에서 애플리케이션 메시지들의 전달을 보장하는 것이 주요 목적이다.
신뢰성 메시징 기술은 어느 메시지들이 오직 한 번만 부과적으로는 순서에 맞게 웹 서비스의 양 끝단에 전달되는 것을 보장한다. 신뢰성 메시징 기술은 메시지가 전달되지 못했을 경우 이를 복구하는 기술인 것이다. 메시지가 중간에서 사라졌다면 메시지를 보낸 시스템은 이를 받아들이는 시스템으로부터 확인(Acknowledge) 메시지를 받을 때까지 그 메시지를 재전송할 것이고 한편 받아들이는 시스템에서 메시지들이 순서에 맞게 들어오지 않았다면 이를 순서에 맞게 다시 고쳐서 웹 서비스 Endpoint에 전달하게 된다.
다음과 같은 문제점들이 발생할 경우에는 신뢰성 메시징의 사용을 고려해야 한다.
통신 실패(Communication failure)가 발생하여 가능하지 않은 네트워크(unavailable network) 혹은 연결의 끊김(connection drop)이 생기는 현상을 야기하는 경우
애플리케이션 메시지가 전송 도중 사라지는 경우
순서에 맞게 전송되는 애플리케이션 메시지를 요구하는 경우인데 순서에 맞게 전송되지 않는 경우
신뢰성 메시징을 사용할 것인지를 고려할 때 다음과 같은 장단점들 비교해봐야 한다.
신뢰성 메시징은 소스로부터 목적지까지 단 한 번만 전송되는 것을 의미한다. 만약 순서에 맞게 전송되는 옵션을 선택했을 경우 그 메시지는 순서에 맞게 전송된다.
신뢰성 메시징으로 웹 서비스의 메시지를 전송하는 경우 이는 전체 웹 서비스의 성능을 저하시킬 수 있다. 특히 순서에 맞게 전송되는 옵션일 경우에 더 심하다.
신뢰성 메시징을 사용하지 않는 클라이언트는 이를 사용하는 웹 서비스와 상호 운용할 수 없다.
이러한 신뢰성 메시징에 관한 스펙으로는 다음과 같은 것들이 있다.
WS-Reliable Messaging
WS-Coordination
WS-AtomicTransactions
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] << 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을 먼저 얻어야 한다.
C:\>wsgen fromjava.server.AddNumbersImpl -d web/WEB-INF -policy service-config.xml
다음은 service-config.xml의 내용이다.
[예 15.2] << 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> <rm-policy> <inactivityTimeout>600000</inactivityTimeout> <acknowledgementInterval>1000</acknowledgementInterval> </rm-policy> </endpoint-policy-subject> </policy> </web-services-config>
Java 클래스로부터의 구현은 wsit-endpoint.xml이라는 Deployment Descriptor 파일이 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된다는 사실을 제외하고 기본적인 JEUS 6 웹 서비스와 동일하다.
다음은 본 장에서 사용되는 예제의 service-config.xml 파일의 예이다.
[예 15.3] << 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> <rm-policy> <inactivityTimeout>600000</inactivityTimeout> <acknowledgementInterval>1000</acknowledgementInterval> </rm-policy> </endpoint-policy-subject> </policy> </web-services-config>
위의 service-config.xml 파일을 가지고 wsgen을 통해 웹 서비스를 생성하기 위해서는 다음과 같이 입력한다.
C:\>ant build
웹 서비스가 정상적으로 생성되었다면 다음과 같은 구조를 가지게 된다.
C:\web | +-- WEB-INF | +-- wsit-fromjava.server.AddNumbersImpl.xml +-- classes | +-- fromjava.server.AddNumbersImpl
우리가 원하는 wsit-fromjava.server.AddNumbersImpl.xml 파일을 얻게 되었다. 앞서 설명했던 것과 마찬가지로 이 파일은 WAR 또는 EAR 패키징에서 WEB-INF 폴더에 추가된 것을 알 수 있다.
서비스를 디플로이하기 위해 다음과 같이 실행한다.
C:\>ant deploy
웹 서비스가 정상적으로 디플로이되면 이를 사용하는 클라이언트를 다음과 같이 생성하고 서비스를 호출한다.
C:\>ant run ... run: [java] ########################################## [java] ### JAX-WS Webservices examples - wsit ### [java] ########################################## [java] Testing wsit webservices... [java] Success! ... BUILD SUCCESSFUL