WSIF(Web Services Invocation Framework) 서비스에서
전송 메커니즘에서 JMS(Java™ Message Service)를
사용하는 SOAP 서비스에 액세스하도록 하는
WSDL(Web Services Description Language) 확장을 쓸 수 있습니다.
시작하기 전에
이 주제에서는 WebSphere® Application
Server(기본 메시징 제공자 또는 WebSphere MQ
메시징 제공자와 같은 다른 제공자)를 설치한 경우 JMS 제공자를 선택 및 구성했다고
가정합니다. 그렇지 않은 경우 지금
메시징 제공자 선택에서 설명한 대로,
수행하십시오.
이 태스크 정보
SOAP 메시지가 XML만 포함하는 경우 JMS 메시지 본문 유형
TextMessage를 통해 JMS(Java Message Service) 전송
메커니즘에서 수행할 수 있습니다.
SOAP 엔벨로프를 포함하는 SOAP 메시지는 JMS 메시지로 랩핑되며, 적절한 큐에 배치됩니다.
컨테이너는 JMS 메시지를 수신하고 클라이언트로 전송할 SOAP 메시지를 제거합니다.
다음 프로시저 및 연관된 코드 단편을 사용하여
WSIF 서비스에서 SOAP over JMS 서비스에 액세스하도록 하는
WSDL(Web Services Description Language) 확장을 작성하는 데 도움을 줍니다.
참고: 또한 SOAP over HTTP에 대한 WSDL 바인딩 확장을 쓸 경우 지침으로
이 프로시저를 사용할 수 있습니다. SOAP over JMS 바인딩은
SOAP over HTTP 바인딩과 거의 동일하기 때문입니다.
프로시저
- SOAP over JMS 바인딩을 선택하십시오.
JMS가 사용됨을
표시하도록 <soap:binding> 태그의 transport
속성을 설정합니다. style 속성도
rpc(원격 프로시저 호출(RPC))로 설정한 경우
WSIF(Web Services Invocation Framework)에서는 웹 서비스 엔드포인트에서 조작이 호출되었다고
가정합니다.
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/jms"/>
- JMS 주소를 설정하십시오.
참고: 다음 단계에서 제공하는
JMS 주소를 지정할 경우 대체 방법도 참조하십시오.
SOAP over JMS의 경우
<wsdl:port> 태그는 <jms:address>
요소를 포함해야 합니다. 이 요소는 클라이언트가 JMS 프로그래밍 모델을
사용하여 웹 서비스에 올바르게 연결하는 데 필요한 정보를 제공합니다.
일반적으로 이 정보는 JMS 클라이언트 역할을 하는 SOAP over JMS 바인딩을 지원하기
위해 생성된 스텁입니다. 또는 웹 서비스 클라이언트는 JMS 프로그래밍 모델을 직접 사용할 수
있습니다.
<jms:address>
요소는 다음 양식을 사용합니다.
<jms:address
destinationStyle="queue"
jmsVendorURI="http://ibm.com/ns/mqseries"?
initialContextFactory="com.ibm.NamingFactory"?
jndiProviderURL="iiop://something:900/wherever"?
jndiConnectionFactoryName="orange"
jndiDestinationName="fred">
<jms:propertyValue name="targetService" type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
여기서 별표(
?)로 표시된 속성은
선택적입니다.
선택적 jmsVendorURI 속성은
JMS 구현을 고유하게 식별하는 문자열입니다. WSIF는
클라이언트 개발자가 사용하는 이 URI를 무시하며,
클라이언트 런타임 환경에서 올바른 JMS 제공자에 대한 액세스 권한을 보유하는지 판별하기 위한
클라이언트 구현도 무시할 수 있습니다.
선택적 속성
initialContextFactory 및 jndiProviderURL은
런타임 환경에서 기본 JNDI(Java Naming and Directory Interface) 제공자가 구성된 경우에만 생략할 수
있습니다.
jndiConnectionFactoryName 속성은
JMS ConnectionFactory 오브젝트의 이름을 제공합니다. 이 이름은
jndiContext 속성에서 제공하는 JNDI 컨텍스트에서 검색할 수 있습니다.
이 ConnectionFactory 오브젝트는 큐를 소유한 JMS 제공자 인스턴스에 대한
JMS 연결을 작성하는 데 사용됩니다. 단순한 구성에서는 서버 메시지 리스너 및 클라이언트가
동일한
ConnectionFactory 오브젝트를 사용합니다. 그러나
서버 및 클라이언트는 모두 동일한 JMS 제공자 인스턴스에 대한 연결을 작성한 경우
서로 다른 ConnectionFactory 오브젝트를 사용할 수 있습니다.
targetService <jms:propertyValue> 요소의
value 속성은 대상 서비스에 대한
webservices.xml 파일의 <port-component-name> 요소에
정의된, 대상 서비스의 포트 컴포넌트 이름입니다.
- JMS 주소를 설정하십시오(대체 방법).
SOAP over JMS
제공자의 경우 다음 형식으로 <soap:address> 태그를 사용하여 JMS 주소를 대신 지정할 수
있습니다.
jms:/[queue|topic]?<property>=<value>&<property>=<value>&...
여기서
queue 또는
topic의 스펙은 JMS 주소
destinationStyle 속성에 대응합니다.
표 1. <soap:address> 태그에서 사용하기에 올바른
특성. 열 1은 특성 이름을 지정하고, 열 2는 특성을 설명하고,
열 3은 대응하는 JMS 주소 값을 지정합니다. 특성 이름 |
특성 설명 |
대응하는 JMS 주소 값 |
destination |
대상 큐 또는 토픽의 JNDI 이름 |
jndiDestinationName |
connectionFactory |
연결 팩토리의 JNDI 이름. |
jndiConnectionFactory |
targetService |
대상 서비스의 포트 컴포넌트 이름 |
targetService jms:propertyValue within jms:address |
JNDI 관련 특성(선택사항): |
initialContextFactory |
초기 컨텍스트 팩토리의 이름. |
initialContextFactory |
jndiProviderURL |
JNDI 제공자 URL |
jndiProviderURL |
JMS 관련 특성(선택사항): |
deliveryMode |
요청 메시지의 지속성 여부에 대한 표시. 올바른 값은 DeliveryMode.NON_PERSISTENT(기본값)
및 DeliveryMode.PERSISTENT입니다. |
JMSDeliveryMode |
비밀번호 |
연결 팩토리에 대한 액세스 권한을 얻을 때 사용할 비밀번호. |
JMSPassword |
우선순위 |
요청 메시지와 연관된 JMS 우선순위. 올바른 값은 0 - 9입니다. 기본값은 4입니다. |
JMSDeliveryMode |
replyTo |
회신 메시지를 전송해야 하는 JNDI 대상 큐. |
JMSReplyTo |
timeToLive |
요청 메시지의 수명(밀리초). 0의 값은 무한 수명을 나타냅니다. |
JMSTimeToLive |
userid |
연결 팩토리에 대한 액세스 권한을 얻을 때 사용할 사용자 ID. |
JMSUserid |
다음은 이 형식의 예제입니다.
<jms:address>
형식:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory="com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
<soap:address> format:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<soap:address location="jms:/queue?connectionFactory=myQCF&destination
=myQ&initialContextFactory=com.ibm.NamingFactory&jndiProviderURL
=iiop://something:900/&targetService=StockQuoteServicePort" />
</wsdl:port>
- JMS 헤더 및 특성을 설정하십시오.
<jms:property>
태그를 사용하여 JMS 헤더 및 특성을 설정합니다.
이 태그는 메시지 파트 또는 리터럴 값을 JMS 특성으로 맵핑합니다.
<jms:property name="Priority" {part="requestPriority" | value="fixedValue"}/>
<jms:property>에
리터럴 값이 있으면 <jms:address> 태그와도 중첩할 수
있습니다.
<jms:property name="Priority" value="fixedValue" />
<jms:property>
태그의 이 양식도 기존 JMS 바인딩에서
사용할 수 있습니다.
SOAP over JMS 바인딩을 정의하는 WSDL 예제
<!-- Example: SOAP over JMS Text Message -->
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
name="StockQuoteInterfaceDefinitions"
targetNamespace="urn:StockQuoteInterface"
xmlns:tns="urn:StockQuoteInterface"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="GetQuoteInput">
<part name="symbol" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="GetQuoteOutput">
<part name="value" type="xsd:float"/>
</wsdl:message>
<wsdl:portType name="StockQuoteInterface">
<wsdl:operation name="GetQuote">
<wsdl:input message="tns:GetQuoteInput"/>
<wsdl:output message="tns:GetQuoteOutput"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoapJMSBinding" type="tns:StockQuoteInterface">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/jms"/>
<wsdl:operation name="GetQuote">
<soap:operation soapAction="urn:StockQuoteInterface#GetQuote"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory="com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>