40.5. Callback Approach를 사용하여 비동기 클라이언트 구현

40.5.1. 개요

비동기 작업 호출을 수행하는 다른 방법은 콜백 클래스를 구현하는 것입니다. 그런 다음 콜백 오브젝트를 매개 변수로 사용하는 비동기 원격 메서드를 호출합니다. 런타임은 콜백 오브젝트에 대한 응답을 반환합니다.

콜백을 사용하는 애플리케이션을 구현하려면 다음을 수행합니다.

  1. AsyncHandler 인터페이스를 구현하는 콜백 클래스를 생성합니다.

    참고

    콜백 오브젝트는 애플리케이션에 필요한 모든 응답 처리를 수행할 수 있습니다.

  2. 콜백 개체를 매개 변수로 사용하고 future< ?> 개체를 반환하는 operationNameAsync() 를 사용하여 원격 호출을 만듭니다.
  3. 클라이언트가 응답 데이터에 액세스해야 하는 경우 반환된 future< ? > isDone() 메서드를 폴링하여 원격 끝점이 응답을 전송했는지 확인할 수 있습니다.

    콜백 개체가 모든 응답 처리를 수행하는 경우 응답이 도착했는지 확인할 필요가 없습니다.

40.5.2. 콜백 구현

콜백 클래스는 javax.xml.ws.AsyncHandler 인터페이스를 구현해야 합니다. 인터페이스는 단일 방법을 정의합니다. handleResponseResponse<T>는 Apache CXF 런타임에서 handleResponse() 메서드를 호출하여 응답이 도착했음을 알립니다. 예 40.8. “javax.xml.ws.AsyncHandler 인터페이스” 구현 해야 하는 AsyncHandler 인터페이스의 개요를 보여 줍니다.Shows an outline of the AsyncHandler interface that you must implement.

예 40.8. javax.xml.ws.AsyncHandler 인터페이스

public interface javax.xml.ws.AsyncHandler
{
  void handleResponse(Response<T> res)
}

예 40.9. “콜백 구현 클래스” 예 40.1. “비동기에 대한 WSDL 계약 예” 에 정의된 greetMeSometime 작업의 콜백 클래스를 표시합니다.

예 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. “콜백 구현 클래스” 에 표시된 콜백 구현은 다음을 수행합니다.

원격 끝점에서 반환된 응답 을 보유하는 멤버 변수 response를 정의합니다.

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. “비동기 작업 호출을 위한 콜백 접근 방식” 의 코드는 다음을 수행합니다.

콜백 오브젝트를 인스턴스화합니다.

프록시에서 콜백 오브젝트를 사용하는 greetMeSometimeAsync() 를 호출합니다.

method 호출은 future< ?> 개체를 즉시 클라이언트에 반환합니다. Apache CXF 런타임은 원격 끝점에서 응답을 수신하는 세부 정보를 처리하고 콜백 오브젝트의 handleResponse() 메서드를 호출하고 Response< GreetMeSometimeResponse > 오브젝트를 채웁니다.

참고

런타임은 원격 끝점의 greetMeSometime() 메서드로 요청을 전송하고 원격 끝점의 지식 없이 호출의 비동기 특성에 대한 세부 정보를 처리합니다. 따라서 서비스 구현 엔드포인트는 클라이언트가 응답을 기다리는 방법에 대해 걱정할 필요가 없습니다.

반환된 future< ? > 개체의 isDone() 메서드를 사용하여 응답이 원격 끝점에서 도착했는지 확인합니다.

콜백 오브젝트의 getResponse() 메서드를 호출하여 응답 데이터를 가져옵니다.