40.5. 콜백 접근 방식을 사용하여 비동기 클라이언트 구현
40.5.1. 개요
비동기 작업 호출을 수행하는 다른 방법은 콜백 클래스를 구현하는 것입니다. 그런 다음 콜백 오브젝트를 매개 변수로 사용하는 비동기 원격 메서드를 호출합니다. 런타임은 콜백 오브젝트에 대한 응답을 반환합니다.
콜백을 사용하는 애플리케이션을 구현하려면 다음을 수행합니다.
AsyncHandler 인터페이스를 구현하는 콜백 클래스를 생성합니다.
참고콜백 오브젝트는 애플리케이션에 필요한 모든 양의 응답 처리를 수행할 수 있습니다.
-
콜백 오브젝트를 매개 변수로 사용하고
Future<?> 오브젝트를 반환하는
수행합니다.operationNameAsync()
를 사용하여 원격 호출을 클라이언트가 응답 데이터에 액세스해야 하는 경우 반환된
Future
<?> 개체의isDone()
메서드를 폴링하여 원격 엔드포인트에서 응답을 전송했는지 확인할 수 있습니다.콜백 오브젝트가 모든 응답 처리를 수행하는 경우 응답이 도착했는지 확인할 필요가 없습니다.
40.5.2. 콜백 구현
콜백 클래스는 javax.xml.ws.AsyncHandler 인터페이스를 구현해야 합니다. 인터페이스는 단일 메서드를 정의합니다. handleResponse
Response<T
> 다시 Apache CXF 런타임은 handleResponse()
메서드를 호출하여 응답이 도착했음을 클라이언트에 알립니다. 예 40.8. “The javax.xml.ws.AsyncHandler Interface” 구현해야 하는 AsyncHandler 인터페이스의 개요를 보여줍니다.
예 40.8. The javax.xml.ws.AsyncHandler Interface
public interface javax.xml.ws.AsyncHandler { void handleResponse(Response<T> res) }
예 40.9. “콜백 구현 클래스” 예 40.1. “비동기 계약에 대한 WSDL 계약 예” 에 정의된 MeSometime 작업의 콜백 클래스를 표시합니다.
예 40.9. 콜백 구현 클래스
package demo.hw.client; import javax.xml.ws.AsyncHandler; import javax.xml.ws.Response; import org.apache.hello_world_async_soap_http.types.*; public class GreeterAsyncHandler implements AsyncHandler<GreetMeSometimeResponse> { private GreetMeSometimeResponse reply; public void handleResponse(Response<GreetMeSometimeResponse> response) { try { reply = response.get(); } catch (Exception ex) { ex.printStackTrace(); } } public String getResponse() { return reply.getResponseType(); } }
예 40.9. “콜백 구현 클래스” 에 표시된 콜백 구현은 다음을 수행합니다.
원격 끝점에서 반환된 응답을
보유하는 멤버 변수 응답 을 정의합니다.
handleResponse()
를 구현합니다.
이 구현에서는 응답을 추출하고 멤버 변수 회신
에 할당할 수 있습니다.
getResponse()
라는 추가된 메서드를 구현합니다.
이 방법은 회신
에서 데이터를 추출하여 반환하는 편리한 방법입니다.
40.5.3. 소비자 구현
예 40.10. “비동기 작업 호출에 대한 콜백 접근 방식” 콜백 방법을 사용하여 예 40.1. “비동기 계약에 대한 WSDL 계약 예” 에 정의된 GreetMeSometime 작업에 대한 비동기 호출을 수행하는 클라이언트를 보여줍니다.
예 40.10. 비동기 작업 호출에 대한 콜백 접근 방식
package demo.hw.client; import java.io.File; import java.util.concurrent.Future; import javax.xml.namespace.QName; import javax.xml.ws.Response; import org.apache.hello_world_async_soap_http.*; public final class Client { ... public static void main(String args[]) throws Exception { ... // Callback approach GreeterAsyncHandler callback = new GreeterAsyncHandler(); Future<?> response = port.greetMeSometimeAsync(System.getProperty("user.name"), callback); while (!response.isDone()) { // Do some work } resp = callback.getResponse(); ... System.exit(0); } }
예 40.10. “비동기 작업 호출에 대한 콜백 접근 방식” 의 코드는 다음을 수행합니다.
콜백 오브젝트를 인스턴스화합니다.
프록시에서 콜백 오브젝트를 사용하는 MeSometimeAsync()
를 호출합니다.
메서드 호출은 Future<?>
개체를 클라이언트에 즉시 반환합니다. Apache CXF 런타임은 원격 끝점에서 응답을 수신하고, 콜백 오브젝트의 handleResponse()
메서드를 호출하고, Response< GreetMeSometimeResponse
> 오브젝트를 채우는 방법에 대한 세부 정보를 처리합니다.
런타임은 원격 끝점의 Cryostat MeSometime()
메서드로 요청을 전송하고 원격 끝점의 지식 없이 호출의 비동기 특성에 대한 세부 정보를 처리합니다. 끝점 및 서비스 구현에서는 클라이언트가 응답을 기다리는 방법에 대한 세부 정보에 대해 우려할 필요가 없습니다.
반환된 Future<?&
gt; 개체의 isDone()
메서드를 사용하여 원격 끝점에서 응답이 도착했는지 확인합니다.
콜백 오브젝트의 getResponse()
메서드를 호출하여 응답 데이터를 가져옵니다.