3
我的Restlet似乎在一些(非常簡單的)併發調用後變得沒有響應。爲了重現最簡單的方法可能,我已經建立了一個簡單的應用:Restlet併發問題
public final class TestRestlet extends Application {
public static final String COUNT_10_ROUTE = "/countTen";
public static final String COUNT_20_ROUTE = "/countTwenty";
@Override
public final Restlet createInboundRoot() {
final Router mainRouter = new Router(getContext());
mainRouter.attach(COUNT_10_ROUTE, CountToTenResource.class);
mainRouter.attach(COUNT_20_ROUTE, CountToTwentyResource.class);
return mainRouter;
}
}
這些資源僅進行簡單的迭代,如下所示:
public final class CountToTenResource extends ServerResource {
@Get
public Representation count() {
for (int i = 0; i < 10; i++) {
System.out.println("CT10 resource - counted up to " + i);
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
return new StringRepresentation("Counted to 10\n");
}
}
...,同樣的CountToTwentyResource 。我開始了我的Restlet這樣的:
final Component component = new Component();
component.getServers().add(Protocol.HTTP, 12345);
final TestRestlet testRestlet = new TestRestlet();
component.getDefaultHost().attach(testRestlet);
component.start();
,然後我繼續在同一時間
curl -X GET http://localhost:12345/countTen
curl -X GET http://localhost:12345/countTwenty
第一資源成功返回它的消息捲曲這兩個資源,但第二個似乎凍結整個托架從此變得沒有反應。我已經用this java RESTClient進行了相同的測試,並且再次出現卡澀。
有沒有人有任何想法爲什麼發生這種情況,以及如何解決它?我究竟做錯了什麼?我正在使用Restlet 2.1.0版。
你應該捕捉到一般的例外嗎?也許第二次調用拋出異常,服務器中止? –