我已到處尋找此問題,但無法找到答案。我甚至看到了一本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!!
有人可以告訴我如何做到這一點?謝謝。
好吧,情況變得更糟。我嘗試設置這樣的超時:Context context = new Context(); context.getParameters()。set(「socketConnectTimeoutMs」,「2000」); ClientResource resource = new ClientResource(context,url);發生的事情是它確實超時了,但是它在Restlet代碼中拋出了一個類型爲org.apache.http.conn.ConnectTimeoutException的不可捕捉的異常。 – Marc
我的問題是我需要超時。但是我沒有像你那樣無法捕捉的異常?!你究竟在哪裏得到你的例外? – Charmin