2014-01-07 105 views
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版。

+0

你應該捕捉到一般的例外嗎?也許第二次調用拋出異常,服務器中止? –

回答

0

Theo,請嘗試將Jetty或Simple擴展JAR及其依賴關係添加到類路徑中。這將取代不夠穩定的內部/默認HTTP連接器。