We're using RESTlet to do a small little REST server for a project we have. We set up a bunch of routes in a class inheriting from Application:
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; } The problem: If I request a .js file in the JAR via Ajax from a web page (also loaded via CLAP from this JAR), it'll only return the first 7737 bytes of that file and then hang. I can't get it to return the rest of the file. It always hangs after exactly the same number of bytes. 1 in 50 times it works.
Any ideas why it's hanging? Can I just turn off chunked encoding for CLAP and static files (all ours are quite small).
This is driving us nuts.
I don't know which server connector you use for your application but it seems that it's the default one.
Restlet is pluggable and extensible at different levels. I recommend you to use the Jetty one. To do that simply add the JAR file for the Jetty extension (org.restlet.ext.jetty.jar) within your classpath. The connector will be automatically registered and use instead of the default one.
I also recommend you to upgrade to the latest version (2.3).
To see which connectors are registered in the Restlet engine, you can use the following code:
List<ConnectorHelper<Server>> serverConnectors = Engine.getInstance().getRegisteredServers(); for (ConnectorHelper<Server> connectorHelper : serverConnectors) { System.out.println("Server connector: "+connectorHelper); } You shouldn't have such problems after doing this.
Hope it helps you, Thierry
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With