2013-08-01 72 views
4

我已到處尋找此問題,但無法找到答案。我甚至看到了一本Restlet書,它只給出了部分答案,甚至部分答案也是錯誤的。如何使用超時調用Restlet中的異步HTTP客戶端

我想要做的事很簡單。我需要對HTTP URL執行簡單的GET請求。我知道如何同步執行此操作:

Engine.getInstance().getRegisteredClients().clear(); 
Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null)); 

ClientResource resource=new ClientResource(url); 
Representation rep=resource.get(); 
String respText=rep.getText(); 
// handle the response in respText as you see fit 

當然,問題是,在這個resource.get塊(),直到收到響應。我真正想要做的是異步執行此操作,即設置回調(使用resource.setOnResponse方法?),然後在不阻塞的情況下觸發請求。我也想設置一個超時值,這樣如果我在合理的時間內沒有收到超時,它會觸發某種onTimeout或onError方法。

有人會認爲這是一個很常見的事情,有人可能想用Restlet做,但我沒有找到討論這個問題的文檔。我看到的唯一討論是在Restlet書中,它在代碼清單9.2中說get()方法不會阻塞,事實上它的確如此。換句話說,我試過這個:

Engine.getInstance().getRegisteredClients().clear(); 
    Engine.getInstance().getRegisteredClients().add(new HttpClientHelper(null)); 

    ClientResource resource=new ClientResource(url); 
    resource.setOnResponse(new Uniform() { 
      public void handle(Request request, Response response) { 
       try { 
        int statusCode=response.getStatus().getCode(); 
        // Print status code, should be 200 
        System.out.println("Status code is "+statusCode); 
        System.out.println(""); 
        System.out.println(""); 
        if (statusCode==200) { 
         onSuccess(response); // this is my own success handler method 
        } else { 
         System.out.println("ERROR: Bad response from server"); 
        } 
       } catch (Exception ex) { 
        // handle exception 
       } 
      } 
    }); 
    System.out.println("Before resource get"); 
    resource.get(); // This blocks!! 

有人可以告訴我如何做到這一點?謝謝。

+0

好吧,情況變得更糟。我嘗試設置這樣的超時:Context context = new Context(); context.getParameters()。set(「socketConnectTimeoutMs」,「2000」); ClientResource resource = new ClientResource(context,url);發生的事情是它確實超時了,但是它在Restlet代碼中拋出了一個類型爲org.apache.http.conn.ConnectTimeoutException的不可捕捉的異常。 – Marc

+0

我的問題是我需要超時。但是我沒有像你那樣無法捕捉的異常?!你究竟在哪裏得到你的例外? – Charmin

回答