2014-01-24 8 views
40

Wir verwenden RESTlet, um einen kleinen REST-Server für ein Projekt zu erstellen, das wir haben. Wir setzten eine Reihe von Routen in einer Klasse von Application vererben bis:Restlet-, CLAP-, Ajax- und Chunk-Timeouts

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; 
} 

Das Problem: Wenn ich eine Js Datei im JAR über Ajax von einer Web-Seite (auch geladen über CLAP aus dieser JAR anfordern), wird nur die ersten 7737 Bytes dieser Datei zurückgeben und dann hängen. Ich kann den Rest der Datei nicht zurückgeben. Es hängt immer genau nach der gleichen Anzahl von Bytes. 1 in 50 mal funktioniert es.

Irgendwelche Ideen, warum es hängt? Kann ich die Chunked-Codierung für CLAP- und statische Dateien einfach deaktivieren (alle sind ziemlich klein).

Das macht uns verrückt.

+1

Können Sie angeben, welche Version von Restlet Sie verwenden. Hast du es mit der neuesten Version 2.2 (stable) versucht? –

+0

Verbindest du dich direkt mit dem Container (Jetty, Tomcat, ...) oder ist etwas dazwischen - wie ein Apache HTTP Server? Wir hatten das Problem, dass dieser die Verbindung nach 8kb Daten schloss. – cheffe

+0

GIve vollständige Details Ihrer Bereitstellung einschließlich JDK-Version, Servlet Engine Version? –

Antwort

1

Ich weiß nicht, welche Server-Connector Sie für Ihre Anwendung verwenden, aber es scheint, dass es der Standard ist.

Restlet ist steckbar und erweiterbar auf verschiedenen Ebenen. Ich empfehle Ihnen, den Jetty zu benutzen. Fügen Sie dazu einfach die JAR-Datei für die Jetty-Erweiterung (org.restlet.ext.jetty.jar) in Ihren Klassenpfad ein. Der Connector wird automatisch registriert und anstelle des Standardconnectors verwendet.

Ich empfehle Ihnen auch, auf die neueste Version (2.3) zu aktualisieren.

Um zu sehen, welche Anschlüsse im Motor Restlet registriert sind, können Sie den folgenden Code verwenden:

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

Sie nicht solche Probleme nach dies zu tun haben sollte.

Hoffe, es hilft Ihnen, Thierry