JAX-WS 웹 서비스 비동기 호출

JAX-WS(Java™ API for XML-Based Web Services)에서는 비동기 클라이언트 호출을 사용하여 웹 서비스 호출을 지원합니다. JAX-WS는 웹 서비스를 비동기로 호출할 때 콜백 및 폴링 모델 모두에 대한 지원을 제공합니다. 콜백 모델 및 폴링 모델 모두 디스패치 클라이언트 및 동적 프록시 클라이언트에서 사용 가능합니다.

시작하기 전에

JAX-WS 동적 프록시 또는 디스패치 클라이언트를 개발합니다. 동적 프록시 클라이언트를 개발하는 경우 wsimport 명령을 사용하여 WSDL(Web Services Description Language) 파일에서 이식 가능한 클라이언트 아티팩트를 생성한 후에 생성된 서비스 엔드포인트 인터페이스(SEI)는 인터페이스에 비동기 메소드를 포함하지 않습니다. JAX-WS 바인딩을 사용하여 동적 프록시 클라이언트에 대한 인터페이스에서 비동기 콜백 또는 폴링 메소드를 추가하십시오. 비동기 맵핑을 사용하려면 WSDL 파일에 jaxws:enableAsyncMapping 바인딩 선언을 추가할 수 있습니다. 비동기 인터페이스를 생성하기 위해 바인딩 사용자 정의를 추가하는 방법에 대한 자세한 정보는 JAX-WS 스펙의 8장을 참조하십시오.

지원된 구성 지원된 구성: wsimport 도구를 실행하고 JAX-WS enableAsyncMapping 바인딩 선언을 사용하여 비동기 호출을 수행할 수 있으면 대응하는 응답 메시지의 WSDL 파일에 파트를 포함하지 않는지 확인하십시오. 응답 메시지가 파트를 포함하지 않으면 요청은 양방향 요청으로 작동하지만 다시 전송되는 실제 응답은 비어 있습니다. wsimport 도구는 무효 응답을 올바르게 처리하지 못합니다. 이 시나리오를 방지하려면 단방향 조작으로 조작이 설정되는 조작에서 출력 메시지를 제거하거나 <wsdl:part>를 메시지에 추가할 수 있습니다. wsimport 도구의 사용법, 구문, 매개변수에 대한 자세한 정보는 JAX-WS 애플리케이션에 대한 wsimport 명령 문서를 참조하십시오. sptcfg

이 태스크 정보

웹 서비스의 비동기 호출은 요청을 서비스 엔드포인트로 전송하고 서비스에서 응답의 리턴을 기다리지 않고 즉시 클라이언트 프로그램으로 제어를 리턴합니다. JAX-WS 비동기 웹 서비스 클라이언트는 폴링 접근 방식 또는 콜백 접근 방식을 사용하여 웹 서비스를 이용합니다. 폴링 모델을 사용하면 클라이언트는 요청을 발행하고 서버가 응답하는지 판별하도록 폴링하는 응답 오브젝트를 수신할 수 있습니다. 서버가 응답하면 실제 응답이 검색됩니다. 콜백 모델을 사용하면 클라이언트는 콜백 핸들러를 제공하여 인바운드 응답 오브젝트를 승인하고 처리합니다. 결과가 사용 가능하면 핸들러의 handleResponse() 메소드가 호출됩니다. 웹 서비스를 호출하기 위한 보다 효율적이고 동적인 모델을 제공하는 동시에, 폴링 및 콜백 모델 모두를 통해 클라이언트가 응답 리턴을 기다리지 않고 계속해서 작업을 처리하는 데 초점을 맞출 수 있습니다. 폴링 호출은 엔터프라이즈 JavaBeans(EJB) 클라이언트 또는 Java EE(Java Platform, Enterprise Edition) 애플리케이션 클라이언트에서만 유효합니다. 콜백 호출은 Java EE 애플리케이션 클라이언트에서만 올바릅니다.

콜백 비동기 호출 모델 사용
콜백 모델을 사용하는 비동기 호출을 구현하기 위해 클라이언트는 AsyncHandler 콜백 핸들러를 제공하여 인바운드 응답 오브젝트를 승인하고 처리합니다. 클라이언트 콜백 핸들러는 javax.xml.ws.AsyncHandler 인터페이스를 구현합니다. 여기에는 서버에서 비동기 응답을 수신할 때 실행되는 애플리케이션 코드가 포함됩니다. javax.xml.ws.AsyncHandler 인터페이스는 런타임이 서버에서 비동기 응답을 수신하고 처리한 후 호출되는 handleResponse(java.xml.ws.Response) 메소드를 포함합니다. 응답은 javax.xml.ws.Response 오브젝트 양식으로 콜백 핸들러에 전달됩니다. get() 메소드가 호출된 경우 응답 오브젝트는 응답 컨텐츠를 리턴합니다. 또한 오류가 수신되면 해당 호출 중에 클라이언트로 예외가 리턴됩니다. 응답 메소드는 동적 프록시 또는 디스패치 클라이언트 인스턴스를 작성하는 데 사용되는 클라이언트의 java.xml.ws.Service 인스턴스에서 실행기 메소드, java.util.concurrent.Executor가 사용하는 스레딩 모델에 따라 호출됩니다. 실행기는 애플리케이션에 의해 등록된 비동기 콜백을 호출하는 데 사용됩니다. setExecutorgetExecutor 메소드를 사용하여 서비스에 대해 구성된 실행기를 수정 및 검색합니다.
폴링 비동기 호출 모델 사용
폴링 모델을 사용하면 클라이언트는 요청을 발행하고 서버가 응답하는지 판별하도록 후속으로 폴링하는 응답 오브젝트를 수신할 수 있습니다. 서버가 응답하면 실제 응답을 검색할 수 있습니다. get() 메소드가 호출된 경우 응답 오브젝트는 응답 컨텐츠를 리턴합니다. 클라이언트는 invokeAsync 메소드에서 javax.xml.ws.Response 유형의 오브젝트를 수신합니다. 해당 응답 오브젝트는 서버에 대한 요청의 상태를 모니터하고, 조작을 완료하는 시점을 판별하고, 응답 결과를 검색하는 데 사용됩니다.
비동기 메시지 교환 사용
기본적으로 비동기 클라이언트 호출은 유선에서 메시지 교환 패턴의 비동기 동작을 보유하지 않습니다. 프로그래밍 모델은 비동기입니다. 그러나 서버에서 요청 또는 응답 메시지의 교환은 비동기 작업이 아닙니다. 비동기 메시지 교환을 사용하려면 com.ibm.websphere.webservices.use.async.mep 특성을 true의 부울 값을 사용하여 클라이언트 요청 컨텍스트에서 설정해야 합니다. 이 특성을 사용하면 클라이언트 및 서버 사이에서 교환되는 메시지는 동기식으로 교환되는 메시지와 다릅니다. 비동기 교환의 경우 요청 및 응답 메시지에는 메시지에 대한 추가 경로 지정 정보를 제공하는 WS-Addressing 헤더가 추가됩니다. 비동기 및 동기 메시지 교환 간 또 다른 중요한 차이점은 비동기 리스너로 응답을 전달하고 이후에 해당 리스너에서 클라이언트로 응답을 다시 전달한다는 점입니다. 비동기 교환의 경우 클라이언트에 응답 청취를 중지함을 알리기 위해 전송되는 제한시간이 없습니다. 클라이언트가 응답을 기다리지 않도록 하려면 폴링 호출에서 리턴되는 오브젝트에서 Response.cancel() 메소드 또는 콜백 호출에서 리턴되는 오브젝트에서 Future.cancel() 메소드를 실행해야 합니다. 응답 취소는 요청을 처리할 때 서버에 영향을 주지 않습니다.
문제점 방지 문제점 방지: 비동기 리스너의 위치는 서버로 전송되므로 서비스는 클라이언트에 회신할 수 있습니다. Windows 운영 체제에서 로컬 호스트 이름은 기본적으로 사용됩니다. 이 이름은 DHCP(Dynamic Host Configuration Protocol)와 호환되기 때문입니다. 그러나 서버가 호스트 이름을 분석할 수 없으면 클라이언트 애플리케이션은 대상 서비스에서 회신을 수신하지 않습니다. 예를 들어, 클라이언트 애플리케이션은 워크스테이션 myhost.bar.com에 호스팅됩니다. 다음 SOAP 메시지 헤더에서 클라이언트 애플리케이션은 해당 호스트 세부사항으로 축약 이름 myhost를 전송합니다. 대상 서버가 myhost를 myhost.bar.com으로 분석할 수 없으면 후속 회신은 클라이언트 애플리케이션에 도달하지 않습니다.
  <soapenv:Header>     
    <wsa:To>http://target.bar.com:81/LiteSecurityService/SecurityService</wsa:To>
    <wsa:ReplyTo>         
      <wsa:Address>http://myhost:2146/axis2/services/LiteSecurityService.
        WSRMServicePort/AnonOutInOp?IBMwebservicesID=922A5DC38A337C4CEF1168347862705
      </wsa:Address>
    </wsa:ReplyTo>
    <wsa:MessageID>urn:uuid:922A5DC38A337C4CEF1168347862403</wsa:MessageID>
    <wsa:Action>getEndpointReference</wsa:Action>
  </soapenv:Header>
이 문제를 해결하려면, 다음 시스템 특성을 JVM(Java Virtual Machine)에 추가하여 IP 형식으로 비동기 리스너에 대한 위치 세부사항을 전송하도록 클라이언트를 구성하십시오. IP 주소를 전송하면 DHCP의 이점을 잃게 됩니다.
-Dcom.ibm.websphere.webservices.transportEPRInIPAddr=yes
gotcha

프로시저

  1. 클라이언트가 웹 서비스를 비동기로 호출할 때 콜백 메소드 또는 폴링 메소드를 구현할 것인지 여부를 판별하십시오.
  2. (선택사항) 클라이언트 요청 컨텍스트를 구성하십시오.
    com.ibm.websphere.webservices.use.async.mep
    특성을 요청 컨텍스트에 추가하여 웹 서비스 클라이언트에 대한 비동기 메시징을 사용하십시오. 이 특성을 사용하려면 서비스 엔드포인트가 애플리케이션 서버에서 기본적으로 지원되는 WS-Addressing을 지원해야 합니다. 다음 예제에서는 이 특성을 설정하는 방법을 보여줍니다.
    Map<String, Object> rc = ((BindingProvider) port).getRequestContext();
     rc.put("com.ibm.websphere.webservices.use.async.mep", Boolean.TRUE);
  3. 비동기 콜백 메소드를 구현하려면 다음 단계를 수행하십시오.
    1. SEI 또는 javax.xml.ws.Dispatch 인터페이스에서 비동기 콜백 메소드를 찾으십시오. SEI의 경우 메소드 이름은 Async로 끝나고 javax.xml.ws.AsyncHandler 유형의 동기 메소드 이외의 매개변수 하나 이상을 포함합니다. invokeAsync(Object, AsyncHandler) 메소드는 디스패치 인터페이스에서 사용된 메소드입니다.
    2. (선택사항) service.setExecutor 메소드를 클라이언트 애플리케이션에 추가하십시오. 실행기 메소드를 추가하면 응답을 처리하는 스케줄링 메소드의 제어를 클라이언트에 제공합니다. 또한 java.current.Executors 클래스 팩토리를 사용하여 패키지된 실행기를 확보하거나 고유한 실행기 클래스를 구현하도록 선택할 수 있습니다. 클라이언트에서 executor 클래스 메소드 사용에 대한 자세한 정보는 JAX-WS 스펙을 참조하십시오.
    3. javax.xml.ws.AsyncHandler 인터페이스를 구현하십시오. javax.xml.ws.AsyncHandler 인터페이스는 handleResponse(javax.xml.ws.Response) 메소드만 포함합니다. 이 메소드는 응답 또는 가능한 경우 예외를 처리하는 논리를 포함해야 합니다. 클라이언트 런타임이 서버에서 비동기 응답을 수신하고 처리한 후에 메소드가 호출됩니다.
    4. 매개변수 데이터 및 콜백 핸들러로 비동기 콜백 메소드를 호출합니다.
    5. handleResponse(Response) 메소드는 응답이 사용 가능한 경우 콜백 오브젝트에서 호출됩니다. Response.get() 메소드는 응답을 전달하기 위해 이 메소드에서 호출됩니다.
  4. 폴링 메소드를 구현하기 위해 다음을 수행하십시오.
    1. SEI 또는 javax.xml.ws.Dispatch 인터페이스에서 비동기 폴링 메소드를 찾으십시오. SEI의 경우 메소드 이름은 Async로 종료되며, 이때 리턴 유형은 javax.xml.ws.Response입니다. invokeAsync(Object) 메소드는 디스패치 인터페이스에서 사용됩니다.
    2. 매개변수 데이터로 비동기 폴링 메소드를 호출합니다.
    3. 클라이언트는 서버로의 요청 상태를 모니터하는 데 사용되는 오브젝트 유형, javax.xml.ws.Response를 수신합니다. isDone() 메소드는 호출의 완료 여부를 표시합니다. isDone() 메소드가 true의 값을 리턴하면 get() 메소드를 호출하여 응답 오브젝트를 검색합니다.
  5. 클라이언트가 서비스로부터 응답 대기를 중지해야 하는 경우 콜백 또는 폴링 메소드로 cancel() 메소드를 사용하십시오. cancel() 메소드가 클라이언트에 의해 호출되면 엔드포인트는 요청을 계속 처리합니다. 그러나 클라이언트의 대기 및 응답 처리는 중지됩니다.

결과

JAX-WS 웹 서비스 클라이언트가 비동기로 웹 서비스를 호출하고 이용할 수 있습니다. 비동기 클라이언트 API에 관한 추가 정보는 JAX-WS 스펙을 참조하십시오.

다음 예제는 클라이언트에서 비동기 요청에 대한 메소드를 사용하는 웹 서비스 인터페이스를 설명합니다.
@WebService

public interface CreditRatingService {
       // Synchronous operation.
       Score getCreditScore(Customer     customer);
       // Asynchronous operation with polling.
       Response<Score> getCreditScoreAsync(Customer customer);
       // Asynchronous operation with callback.
       Future<?> getQuoteAsync(Customer customer, 
              AsyncHandler<Score> handler);
}
콜백 메소드 사용
콜백 메소드에는 다음 예제에 나온 콜백 핸들러가 필요합니다. 콜백 프로시저를 사용하는 경우 요청을 작성한 후 콜백 핸들러는 응답 처리를 담당합니다. 응답 값은 응답이거나 예외일 수도 있습니다. Future<?> 메소드는 비동기 계산의 결과를 나타내며 계산을 완료했는지 여부를 확인합니다. 애플리케이션에서 요청을 완료했는지 확인하려는 경우 Future.isDone() 메소드를 호출하십시오. Future.get() 메소드는 유용한 응답을 제공하지 않으며 Response.get() 메소드와 유사하지 않습니다.
CreditRatingService svc = ...;
 
Future<?> invocation = svc.getCreditScoreAsync(customerTom,
       new AsyncHandler<Score>() {
              public void handleResponse (
                     Response<Score> response)
                  {
                     score = response.get();
                     // process the request...
                  }
    }
);
폴링 메소드 사용
다음 예제는 비동기 폴링 클라이언트를 설명합니다.
CreditRatingService svc = ...;
Response<Score> response = svc.getCreditScoreAsync(customerTom);
 
while (!response.isDone()) {
       // Do something while we wait.
}

score = response.get();

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



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