40.6. 원격 서비스에서 반환된 예외 캡처
40.6.1. 개요
비동기 요청을 수행하는 소비자는 동기 요청을 수행할 때 반환된 것과 동일한 예외를 받지 않습니다. 소비자에게 비동기적으로 반환되는 모든 예외는 ExecutionException 예외로 래핑됩니다. 서비스에서 발생한 실제 예외는 ExecutionException 예외의 원인
필드에 저장됩니다.
40.6.2. 예외 검색
원격 서비스에서 생성된 예외는 소비자의 비즈니스 논리에 응답을 전달하는 방법으로 로컬로 throw됩니다. 소비자가 동기 요청을 하면 원격 호출을 통해 예외가 발생합니다. 소비자가 비동기 요청을 수행할 때 Response<T> 개체의 get()
메서드가 예외를 throw합니다. 소비자는 응답 메시지를 검색하려고 시도할 때까지 요청을 처리하는 동안 오류가 발생했음을 검색하지 않습니다.
Cryostat-WS 프레임워크에서 생성된 메서드와 달리 Response<T> 오브젝트의 get()
메서드는 사용자 모델링 예외나 일반 Cryostat-WS 예외도 발생하지 않습니다. 대신 java.util.concurrent.ExecutionException 예외가 발생합니다.
40.6.3. 예외 세부 정보 가져오기
프레임워크는 원격 서비스에서 반환된 예외를 ExecutionException 예외 필드의 cause
필드에 저장합니다. 원격 예외에 대한 세부 정보는 cause
필드의 값을 가져오고 저장된 예외를 검사하여 추출됩니다. 저장된 예외는 모든 사용자 정의 예외 또는 일반 Cryostat-WS 예외 중 하나일 수 있습니다.
40.6.4. 예
예 40.11. “Polling Approach를 사용하여 예외 catch” 폴링 방법을 사용하여 예외를 catch하는 예를 보여줍니다.
예 40.11. Polling Approach를 사용하여 예외 catch
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 { ... // port is a previously established proxy object. Response<GreetMeSometimeResponse> resp = port.greetMeSometimeAsync(System.getProperty("user.name")); while (!resp.isDone()) { // client does some work } try { GreetMeSometimeResponse reply = greetMeSomeTimeResp.get(); // process the response } catch (ExecutionException ee) { Throwable cause = ee.getCause(); System.out.println("Exception "+cause.getClass().getName()+" thrown by the remote service."); } } }
예 40.11. “Polling Approach를 사용하여 예외 catch” 의 코드는 다음을 수행합니다.
호출을 try/catch 블록에서 Response<T> 오브젝트의 get()
메서드로 래핑합니다.
ExecutionException 예외를 가져옵니다.
예외에서 cause
필드를 추출합니다.
소비자가 콜백 접근 방식을 사용하는 경우 예외를 catch하는 데 사용되는 코드는 서비스의 응답이 추출된 콜백 오브젝트에 배치됩니다.