JAX-WS API를 사용하여 동적 클라이언트 개발

JAX-WS(Java™ API for XML-Based Web Services)에서는 서비스 엔드포인트 조작의 동적 호출에 대한 지원을 제공합니다.

이 태스크 정보

JAX-WS에서는 기존 JAX-RPC(Java API for XML-based RPC) 기반 DII(Dynamic Invocation Interface)보다 더 일반적이고 많은 유연성을 제공하는 새 동적 디스패치 클라이언트 API를 제공합니다. 디스패치 클라이언트 인터페이스, javax.xml.ws.Dispatch는 XML 구성을 사용하여 XML 레벨에서의 작업을 선호하는 고급 XML 개발자를 위해 설계된 XML 메시징 중심 클라이언트입니다. 디스패치 클라이언트를 쓰려면 디스패치 클라이언트 API에 대한 전문 지식, 지원되는 오브젝트 유형, 연관된 WSDL(Web Services Description Language) 파일에 대한 메시지 표시에 대한 지식이 필요합니다.

디스패치 API는 PAYLOAD 또는 MESSAGE 모드로 데이터를 전송할 수 있습니다. PAYLOAD 모드를 사용하는 경우 디스패치 클라이언트만 <soap:Body>의 컨텐츠를 제공할 책임이 있으며, JAX-WS는 <soap:Envelope> 요소에 입력 페이로드를 포함합니다. MESSAGE 모드를 사용하는 경우 디스패치 클라이언트는 전체 SOAP 엔벨로프 제공을 담당합니다.

디스패치 클라이언트 API에서는 애플리케이션 클라이언트가 XML로 메시지 또는 페이로드를 구성해야 하며, 메시지 또는 메시지 페이로드에 대한 자세한 지식이 필요합니다. 디스패치 클라이언트는 소스 오브젝트, JAXB(Java Architecture for XML Binding) 오브젝트 또는 데이터 소스 오브젝트를 사용할 때 HTTP 바인딩을 사용할 수 있습니다. 디스패치 클라이언트는 다음 유형의 오브젝트를 지원합니다.
  • javax.xml.transform.Source: 소스 오브젝트를 사용하여 클라이언트에서 XML API를 직접 사용하도록 설정합니다. SOAP 및 HTTP 바인딩에서 소스 오브젝트를 사용할 수 있습니다.
  • JAXB 오브젝트: 클라이언트가 JAX-WS 애플리케이션으로 XML을 작성하고 조작하기 위해 XML 스키마에서 생성된 JAXB 오브젝트를 사용할 수 있도록 JAXB 오브젝트를 사용합니다. JAXB 오브젝트는 SOAP 및 HTTP 바인딩에서만 함께 사용할 수 있습니다.
  • javax.xml.soap.SOAPMessage: 클라이언트가 SOAP 메시지에 대한 작업을 수행할 수 있도록 SOAPMessage 오브젝트를 사용합니다. SOAP 버전 1.1 또는 SOAP 버전 1.2 바인딩에서는 SOAPMessage 오브젝트만 사용할 수 있습니다.
  • javax.activation.DataSource: 클라이언트가 MIME(Multipurpose Internet Mail Extension) 메시지에 대한 작업을 수행할 수 있도록 DataSource 오브젝트를 사용합니다. HTTP 바인딩에서만 DataSource를 사용합니다.
디스패치 API는 JRE(Java SE Runtime Environment) 6에 소개된 일반의 개념을 사용합니다. 디스패치 인터페이스에서 각 invoke() 메소드의 경우 일반을 사용해 리턴 유형을 판별합니다.

프로시저

  1. PAYLOAD 또는 MESSAGE 모드 중에서 동적 클라이언트가 데이터를 전송하는 모드를 판별하십시오.
  2. 서비스 인스턴스를 작성하고 여기에 하나 이상의 포트를 추가하십시오. 포트는 프로토콜 바인딩 및 서비스 엔드포인트 주소 정보를 포함합니다.
  3. Service.Mode.PAYLOAD 메소드 또는 Service.Mode.MESSAGE 메소드를 사용하여 Dispatch<T> 오브젝트를 작성하십시오.
  4. javax.xml.ws.BindingProvider 인터페이스에서 요청 컨텍스트 특성을 구성하십시오. HTTP 인증 사용 또는 엔드포인트 주소 지정과 같은 추가 특성을 지정하도록 요청 컨텍스트를 사용하십시오.
  5. 옵션: JAX-WS 런타임에서 SOAPFaultException의 예외를 처리하지 않으려는 경우 디스패치 API에 대한 RequestContext 옵션에서 jaxws.response.throwExceptionIfSOAPFault 특성을 Boolean.TRUE로 설정하십시오.

    다음 예제는 디스패치 API에 대한 RequestContext 옵션에서 이 특성을 지정하는 방법을 보여줍니다.

    Dispatch<OMElement> dispatch = service.createDispatch( 
    portName, OMElement.class, Mode.MESSAGE);  
    BindingProvider bp = (BindingProvider)dispatch; 
    bp.getRequestContext().put(   
    "jaxws.response.throwExceptionIfSOAPFault", Boolean.FALSE);  
  6. 동적 클라이언트에 대한 클라이언트 요청 메시지를 작성하십시오.
  7. 디스패치 클라이언트에서 동기 또는 비동기 방식으로 서비스 엔드포인트를 호출하십시오.
  8. 서비스에서 응답 메시지를 처리하십시오.

결과

디스패치 API를 사용하여 동적 JAX-WS 클라이언트를 개발합니다. 디스패치 클라이언트 사용에 대한 자세한 정보는 JAX-WS 2.0 스펙의 4장, 3절을 참조하십시오.

JAX-WS 동적 포트(서비스 메소드 addPort를 사용하여 추가됨)에는 WebSphere® Application Server 버전 8.0에서 시작된 추가 메모리 요구사항이 적용될 수 있습니다. 이전 릴리스에서 동적 포트의 단일 인스턴스는 다중 서비스 인스턴스에서 공유될 수 있습니다. 버전 8.x에서 동적 포트는 포트를 추가한 서비스의 인스턴스로 범위가 지정됩니다. JAX-WS 클라이언트가 동일한 이름의 동적 포트를 참조하는 다중 서비스 인스턴스를 포함하면 해당 인스턴스는 더 이상 공유되지 않습니다. 이 때문에 해당 클라이언트의 메모리 요구사항이 잠재적으로 늘어날 수 있습니다. 동적 포트에 사용된 메모리는 서비스 인스턴스가 범위를 벗어나면 해제됩니다. 그러나 늘어난 메모리 사용과 관련된 문제가 발생하면 동적 포트를 서비스 인스턴스에서 다시 공유하도록 동작을 되돌릴 수 있습니다. 이를 수행하려면 시스템 특성 jaxws.share.dynamic.ports.enabletrue 값으로 설정하십시오. 그러나 이로 인해 다른 문제(예: 공유 동적 포트에서 정책 세트 첨부가 잘못 적용됨)가 발생할 수도 있습니다. 이 플래그를 true로 설정하고 이 문제 중 몇 가지가 발생한 경우 플래그 설정을 제거해야 합니다.

이전 릴리스에서 디스패치 클라이언트 애플리케이션이 SOAP 조치를 제공하지 않으면 올바른 SOAP 조치는 아웃바운드 메시지에서 전송되지 않습니다. 대신, SOAP 조치는 익명 조작으로 설정됩니다. WebSphere Application Server 버전 8부터 디스패치 클라이언트 애플리케이션이 SOAP 조치를 제공하지 않으면 JAX-WS 런타임 환경은 발신 메시지를 구문 분석합니다. 이를 통해 호출할 조작을 판별하고 해당 정보를 사용하여 SOAP 조치에서 적절한 값을 판별합니다. 아웃바운드 메시지의 조작 분석은 SOAP 본문 및 메시지 인코딩(예: Doc/Lit/Bare, Doc/Lit/Wrapped)에 기반합니다. 이 구문 분석은 비용이 높을 수 있으므로 특성을 설정할 수 있습니다. 항상 구문 분석을 사용하지 않으려면 특성을 시스템 레벨에서 설정합니다. 메시지별로 구문 분석을 사용하지 않으려면 JAX-WS 요청 메시지 컨텍스트에서 특성을 설정합니다. 특성은 jaxws.dispatch.outbound.operation.resolution.enable의 문자열 값으로 설정된 상수 org.apache.axis2.jaxws.Constants.DISPATCH_CLIENT_OUTBOUND_RESOLUTION으로 정의됩니다. 특성의 기본값은 문자열 true로 해석되는 널입니다. 이 경우 아웃바운드 조작 분석을 사용합니다. 특성을 false로 설정하면 아웃바운드 조작 분석을 사용하지 않습니다. 구문 분석을 사용하지 않는 경우 아웃바운드 메시지의 SOAP 조치는 이전 릴리스에서와 같이 익명 조작으로 설정됩니다. 클라이언트가 JAX-WS javax.xml.ws.BindingProvider 특성, SOAPACTION_USE_PROPERTY, SOAPACTION_URI_PROPERTY를 통해 SOAP 조치를 제공하는 경우 해당 SOAP 조치가 사용됩니다. 따라서 아웃바운드 메시지의 구문 분석은 특성 설정에 상관없이 수행되지 않습니다. 클라이언트에서 명시적으로 SOAP 조치를 설정하는 작업은 특히 서버-제공자의 성능 측면에서 우수 사례로 간주됩니다. 이 사례는 인바운드 메시지를 구문 분석하거나, 올바른 엔드포인트 조작으로 경로 지정되지 않도록 방지합니다.

다음 예제는 디스패치 클라이언트를 작성하고 샘플 EchoService 서비스 엔드포인트를 호출하는 단계를 보여줍니다.
String endpointUrl = ...;
		
QName serviceName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoService");
QName portName = new QName("http://com/ibm/was/wssample/echo/",
 "EchoServicePort");
		
/** Create a service and add at least one port to it. **/ 
Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);
		
/** Create a Dispatch instance from a service.**/ 
Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, 
SOAPMessage.class, Service.Mode.MESSAGE);
	
/** Create SOAPMessage request. **/
// compose a request message
MessageFactory mf = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);

// Create a message.  This example works with the SOAPPART.
SOAPMessage request = mf.createMessage();
SOAPPart part = request.getSOAPPart();

// Obtain the SOAPEnvelope and header and body elements.
SOAPEnvelope env = part.getEnvelope();
SOAPHeader header = env.getHeader();
SOAPBody body = env.getBody();

// Construct the message payload.
SOAPElement operation = body.addChildElement("invoke", "ns1",
 "http://com/ibm/was/wssample/echo/");
SOAPElement value = operation.addChildElement("arg0");
value.addTextNode("ping");
request.saveChanges();

/** Invoke the service endpoint. **/
SOAPMessage response = dispatch.invoke(request);

/** Process the response. **/

주제 유형을 표시하는 아이콘 태스크 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxwsdynclient
파일 이름:twbs_jaxwsdynclient.html