2014-09-04 175 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..."); 
     } 
    }); 
    } 
} 

正如我預期的字符串打印幾乎立即。但是這個過程持續運行大約一分鐘,儘管沒有任何應該執行的代碼。 JAX-RS規範只是說我們應該使用InvocationCallback而沒有別的對我的問題至關重要。但即使我使用Future也會產生相同的效果。我還測試過,如果這與超時有關,這是非常不可能和錯誤的。調試器顯示有一些線程正在運行,即DestroyJavaVMjersey-client-async-executor-0pool-1-thread-1在resteasy的情況下。

你知道這裏出了什麼問題嗎?

回答

1

諮詢JavaDoc是非常有幫助的。關於我的問題it says

客戶端是管理客戶端通信基礎設施的重量級對象。初始化以及處理客戶端實例可能是一個相當昂貴的操作。因此建議在應用程序中只構建少量的客戶端實例。客戶端實例在處置之前必須正確關閉以避免資源泄露。

如果我正確關閉客戶端,一切都按預期工作。

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