2014-01-24 47 views
40

我們正在使用RESTlet爲我們的項目做一個小的REST服務器。我們成立了一個類繼承Application一堆路線:Restlet,CLAP,Ajax和塊超時

public static void createRestServer(ApplicationContext appCtx, String propertiesPath) throws Exception { 

    // Create a component 
    Component component = new Component(); 
    component.getServers().add(Protocol.HTTP, 8081); 
    component.getClients().add(Protocol.FILE); 
    component.getClients().add(Protocol.CLAP); 

    Context context = component.getContext().createChildContext(); 
    RestServer application = new RestServer(context); 

    application.getContext().getParameters().add("useForwardedForHeader", "true"); 

    application.getContext().getAttributes().put("appCtx", appCtx); 
    application.getContext().getAttributes().put("file", propertiesPath); 

    // Attach the application to the component and start it 
    component.getDefaultHost().attach(application); 
    component.start(); 
} 

private RestServer(Context context) { 
    super(context); 
} 

public synchronized Restlet createInboundRoot() { 
    Router router = new Router(getContext()); 

    // we then have a bunch of these 
    router.attach("/accounts/{accountId}", AccountFetcher.class); //LIST Account level 
    // blah blah blah 

    // finally some stuff for static files: 
    // 
    Directory directory = new Directory(getContext(), 
    LocalReference.createClapReference(LocalReference.CLAP_CLASS, "/")); 
    directory.setIndexName("index.html"); 
    router.attach("/", directory); 

    return router; 
} 

的問題:如果我要求的.js文件在JAR通過Ajax從網頁(也可通過CLAP加載從這個JAR ),它只會返回該文件的第一個7737字節,然後掛起。我無法讓它返回文件的其餘部分。它始終在完全相同的字節數後掛起。 1次50次。

任何想法,爲什麼它掛?我可以關閉CLAP的分塊編碼和靜態文件(我們所有的都很小)。

這使我們變得瘋狂。

+1

你可以說明您正在使用的的Restlet的版本。你有沒有嘗試最新的2.2版本(穩定)? –

+0

您是直接連接到容器(Jetty,Tomcat,...)還是有一些東西在 - 就像Apache HTTP Server?我們遇到了這個數據在8kb後關閉連接的問題。 – cheffe

+0

GI完整的部署細節包括JDK版本,Servlet引擎版本? –

回答

1

我不知道您的應用程序使用哪個服務器連接器,但似乎它是默認的連接器。

Restlet可在不同級別插入和擴展。我建議你使用Jetty。要做到這一點,只需在類路徑中添加Jetty擴展的JAR文件(org.restlet.ext.jetty.jar)即可。連接器將被自動註冊並使用,而不是默認的連接器。

我還建議您升級到最新版本(2.3)。

要查看哪些連接器中的Restlet引擎註冊,您可以使用下面的代碼:

List<ConnectorHelper<Server>> serverConnectors 
     = Engine.getInstance().getRegisteredServers(); 
for (ConnectorHelper<Server> connectorHelper : serverConnectors) { 
    System.out.println("Server connector: "+connectorHelper); 
} 

你不應該這樣做後,這樣的問題。

希望它可以幫助你, 蒂埃裏