2014-09-04 5 views
1

다음 코드를 사용하여 JAX-RS 클라이언트 API를 사용하여 HTTP GET을 통해 자원을 요청하려고합니다. (jersey-client v2.12 및 resteasy-client v3 .0.8 최종 구현을 테스트)JAX-RS 클라이언트 API 비동기 요청

import javax.ws.rs.client.Client; 
import javax.ws.rs.client.ClientBuilder; 
import javax.ws.rs.client.InvocationCallback; 

public class StackOverflowExample { 
    public static void main(String[] args) { 
    Client client = ClientBuilder.newClient(); 
    client.target("http://example.com/").request().async().get(new InvocationCallback<String>() { 
     @Override 
     public void completed(String s) { 
     System.out.println("Async got: " + s); 
     } 

     @Override 
     public void failed(Throwable throwable) { 
     System.out.println("Async failure..."); 
     } 
    }); 
    } 
} 

예상대로 String은 거의 즉시 인쇄됩니다. 그러나 실행해야 할 코드는 없지만 프로세스는 약 1 분 정도 실행됩니다.

JAX-RS 사양은 단지 InvocationCallback을 사용해야하며 내 문제와 관련이 없다고 말합니다. 그러나 내가 Future을 사용하더라도 동일한 효과가 발생합니다. 나는 이것이 매우 희박하고 틀린 타임 아웃과 관련이 있는지 테스트했다. 디버거에서는 restyasy의 경우 DestroyJavaVMjersey-client-async-executor-0 또는 pool-1-thread-1이 실행중인 스레드가 있음을 보여줍니다.

여기에 무슨 문제가 있습니까?

답변

1

JavaDoc을 참조하는 것이 항상 도움이됩니다. 내 이슈에 대해서 it says :

클라이언트는 클라이언트 측 통신 인프라를 관리하는 중량 개체입니다. Client 인스턴스의 초기화와 폐기는 다소 비싼 작업 일 수 있습니다. 따라서 응용 프로그램에서 적은 수의 Client 인스턴스 만 구성하는 것이 좋습니다. 클라이언트 인스턴스가 누출되지 않도록 처리하기 전에 클라이언트 인스턴스를 올바르게 닫아야합니다.

클라이언트를 제대로 닫으면 모든 것이 예상대로 작동합니다.

public class StackOverflowExample { 
    public static void main(String[] args) { 
    Client client = ClientBuilder.newClient(); 
    // request here 
    client.close(); 
    } 
}