40.6. 원격 서비스에서 반환한 예외 catching Exceptions returned from a Remote Service
40.6.1. 개요
비동기 요청을 수행하는 소비자는 동기 요청을 할 때 반환된 것과 동일한 예외를 받지 않습니다. 소비자에게 비동기적으로 반환되는 모든 예외는 ExecutionException 예외로 래핑됩니다. 서비스에서 throw한 실제 예외는 ExecutionException 예외의 cause
필드에 저장됩니다.
40.6.2. 예외를 포착합니다.
원격 서비스에서 생성한 예외는 소비자의 비즈니스 논리에 응답을 전달하는 메서드에서 로컬로 throw됩니다. 소비자가 동기 요청을 하면 원격 호출을 수행하는 메서드에서 예외가 발생합니다. 소비자가 비동기 요청을 수행할 때 Response<T> 개체의 get()
메서드는 예외를 throw합니다. 소비자는 응답 메시지 검색을 시도할 때까지 요청을 처리하는 동안 오류가 발생했음을 감지하지 않습니다.
JAX-WS 프레임워크에서 생성된 메서드와 달리 Response<T> 개체의 get()
메서드는 사용자 모델링 예외 및 일반 JAX-WS 예외가 발생하지 않습니다. 대신 java.util.concurrent.ExecutionException 예외가 throw됩니다.
40.6.3. 예외 세부 정보 가져오기
프레임워크는 원격 서비스에서 반환된 예외를 ExecutionException 예외의 원인
필드에 저장합니다. 원인
필드의 값을 가져오고 저장된 예외를 검사하여 원격 예외에 대한 세부 정보가 추출됩니다. 저장된 예외는 사용자 정의 예외 또는 일반 JAX-WS 예외 중 하나일 수 있습니다.
40.6.4. 예제
예 40.11. “Polling Approach을 사용하여 예외 관리” 은 폴링 방식을 사용하여 예외를 catch하는 예를 보여줍니다.
예 40.11. 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 { ... // 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을 사용하여 예외 관리” 의 코드는 다음을 수행합니다.
Response<T> 개체의 get()
메서드로 호출을 try/catch 블록으로 래핑합니다.
ExecutionException 예외를 catch합니다.
예외에서 cause
필드를 추출합니다.
소비자가 콜백 접근 방식을 사용하는 경우 예외를 catch하는 데 사용되는 코드가 서비스 응답을 추출하는 콜백 오브젝트에 배치됩니다.