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장을 참조하십시오.

이 태스크 정보
웹 서비스의 비동기 호출은 요청을 서비스 엔드포인트로 전송하고 서비스에서 응답의 리턴을 기다리지 않고 즉시 클라이언트 프로그램으로 제어를 리턴합니다. 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가 사용하는 스레딩 모델에 따라 호출됩니다. 실행기는 애플리케이션에 의해 등록된 비동기 콜백을 호출하는 데 사용됩니다. setExecutor 및 getExecutor 메소드를 사용하여 서비스에 대해 구성된 실행기를 수정 및 검색합니다.
- 폴링 비동기 호출 모델 사용
- 폴링 모델을 사용하면 클라이언트는 요청을 발행하고 서버가 응답하는지 판별하도록 후속으로 폴링하는 응답 오브젝트를 수신할 수 있습니다. 서버가 응답하면 실제 응답을 검색할 수 있습니다. get() 메소드가 호출된 경우 응답 오브젝트는 응답 컨텐츠를 리턴합니다. 클라이언트는 invokeAsync 메소드에서 javax.xml.ws.Response 유형의 오브젝트를 수신합니다. 해당 응답 오브젝트는 서버에 대한 요청의 상태를 모니터하고, 조작을 완료하는 시점을 판별하고, 응답 결과를 검색하는 데 사용됩니다.
- 비동기 메시지 교환 사용
- 기본적으로 비동기 클라이언트 호출은 유선에서 메시지 교환 패턴의 비동기 동작을 보유하지 않습니다. 프로그래밍 모델은 비동기입니다. 그러나 서버에서 요청 또는 응답 메시지의 교환은 비동기 작업이 아닙니다. 비동기 메시지 교환을 사용하려면 com.ibm.websphere.webservices.use.async.mep 특성을 true의 부울 값을 사용하여 클라이언트 요청 컨텍스트에서 설정해야 합니다. 이 특성을 사용하면 클라이언트 및 서버 사이에서 교환되는 메시지는 동기식으로 교환되는 메시지와 다릅니다. 비동기 교환의 경우 요청 및 응답 메시지에는 메시지에 대한 추가 경로 지정 정보를 제공하는 WS-Addressing 헤더가 추가됩니다. 비동기 및 동기 메시지 교환 간 또 다른 중요한 차이점은 비동기 리스너로 응답을 전달하고 이후에 해당 리스너에서 클라이언트로 응답을 다시 전달한다는 점입니다. 비동기 교환의 경우 클라이언트에 응답 청취를 중지함을 알리기 위해 전송되는 제한시간이 없습니다. 클라이언트가 응답을 기다리지 않도록 하려면 폴링 호출에서 리턴되는 오브젝트에서 Response.cancel() 메소드 또는 콜백 호출에서 리턴되는 오브젝트에서 Future.cancel() 메소드를 실행해야 합니다. 응답 취소는 요청을 처리할 때 서버에 영향을 주지 않습니다.

<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프로시저
결과
예
@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();