40.4. Polling Approach를 사용하여 비동기 클라이언트 구현
40.4.1. 개요
폴링 접근 방식은 비동기 애플리케이션 개발을 위한 두 가지 방법 중 가장 간단한 방법입니다. 클라이언트는 OperationNameAsync()
라는 비동기 메서드를 호출하고 응답에 대해 폴링하는 Response<T
> 개체를 반환합니다. 응답을 기다리는 동안 클라이언트가 수행하는 작업은 애플리케이션의 요구 사항에 따라 달라집니다. 폴링을 처리하기 위한 두 가지 기본 패턴이 있습니다.
-
비차단 폴링 - 비차단
응답<T>.isDone()
메서드를 호출하여 결과가 준비되었는지 여부를 주기적으로 확인합니다. 결과가 준비되면 클라이언트가 이를 처리합니다. 그렇지 않은 경우 고객은 다른 작업을 계속합니다. -
폴링 차단- 바로
Response<T>.get()
을 호출하고 응답이 도달할 때까지 차단됩니다(선택적으로 시간 초과 지정).
40.4.2. non-blocking 패턴 사용
예 40.6. “비동기 작업 호출에 대한 블록되지 않은 Polling Approach” 에서는 예 40.1. “비동기에 대한 WSDL 계약 예” 정의된 greetMeSometime 작업에서 비동기 호출을 수행하기 위해 비차단 폴링을 사용하는 방법을 보여줍니다. 클라이언트는 비동기 작업을 호출하고 주기적으로 검사하여 결과가 반환되는지 확인합니다.
예 40.6. 비동기 작업 호출에 대한 블록되지 않은 Polling Approach
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 { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_async_soap_http", "SOAPService"); private Client() {} public static void main(String args[]) throws Exception { // set up the proxy for the client Response<GreetMeSometimeResponse> greetMeSomeTimeResp = port.greetMeSometimeAsync(System.getProperty("user.name")); while (!greetMeSomeTimeResp.isDone()) { // client does some work } GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response System.exit(0); } }
예 40.6. “비동기 작업 호출에 대한 블록되지 않은 Polling Approach” 의 코드는 다음을 수행합니다.
프록시에서 greetMeSometimeAsync()
를 호출합니다.
메서드 호출은 Response<GreetMeSometimeResponse
> 개체를 클라이언트에 즉시 반환합니다. Apache CXF 런타임은 원격 끝점에서 응답을 수신하고 Response< GreetMeSometimeResponse
> 오브젝트를 채우는 세부 정보를 처리합니다.
런타임은 원격 끝점의 greetMeSometime()
메서드로 요청을 전송하고 호출의 비동기 특성 세부 정보를 투명하게 처리합니다. 엔드 포인트, 따라서 서비스 구현에서는 클라이언트가 응답을 기다리는 방법에 대한 세부 정보를 염려하지 않습니다.
반환된 Response
오브젝트의 isDone()
를 확인하여 응답이 도착했는지 확인합니다.
응답이 도착하지 않은 경우 클라이언트는 다시 확인하기 전에 계속 작업을 진행합니다.
응답이 도착하면 클라이언트는 get()
메서드를 사용하여 Response
개체에서 이를 검색합니다.
40.4.3. 차단 패턴 사용
블록 폴링 패턴을 사용하는 경우 Response
오브젝트의 isDone()
은 절대 호출되지 않습니다. 대신 Response
오브젝트의 get()
메서드는 원격 작업을 호출한 직후에 호출됩니다. 응답을 사용할 수 있을 때까지 get()
가 차단됩니다.
또한 get()
메서드에 시간 제한을 전달할 수도 있습니다.
예 40.7. “비동기 작동 호출을 위한 Polling Approach 차단” 는 차단 폴링을 사용하는 클라이언트를 보여줍니다.
예 40.7. 비동기 작동 호출을 위한 Polling Approach 차단
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 { private static final QName SERVICE_NAME = new QName("http://apache.org/hello_world_async_soap_http", "SOAPService"); private Client() {} public static void main(String args[]) throws Exception { // set up the proxy for the client Response<GreetMeSometimeResponse> greetMeSomeTimeResp = port.greetMeSometimeAsync(System.getProperty("user.name")); GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response System.exit(0); } }