2012-10-17 5 views
5

ich tun Anfragen an einen Server einen Client habe, die eine gewisse Zeit zu reagieren nehmen könnte.Restlet Server-Socket-Timeout

Wenn der Server wollte es wirft die folgende Ausnahme antworten:

Die Verbindung unterbrochen wurde. Es wurde wahrscheinlich vom Kunden geschlossen.

org.eclipse.jetty.io.EofException bei org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable (SelectChannelEndPoint.java:435) bei org.eclipse.jetty.http.AbstractGenerator.blockForOutput (AbstractGenerator.java:512) bei org.eclipse.jetty.server.HttpOutput.write (HttpOutput.java:159) um org.eclipse.jetty.server.HttpOutput.write (HttpOutput.java:101) um sun. nio.cs.StreamEncoder.writeBytes (StreamEncoder.java:221) um sun.nio.cs.StreamEncoder.implWrite (StreamEncoder.java:282) um sun.nio.cs.StreamEncoder.write (StreamEncoder.java:125) bei sun.nio.cs.StreamEncoder.write (StreamEncoder.java:135) bei java.io.OutputStreamWriter.write (OutputStreamWriter.java:220) bei java.io.Writer.write (Writer.java:157) bei org.restlet.representation.StringRepresentation.write (StringRepresentation.java:237) bei org.restlet.representation.CharacterRepresentation.write (CharacterRepresentation.java:76) bei org.restlet.engine.adapter.ServerCall.writeResponseBody (ServerCall.java:509) bei org.restlet.engine.adapter .ServerCall.sendResponse (ServerCall.java:453) bei org.restlet.ext.jetty.internal.JettyCall.sendResponse (JettyCall.java:312) bei org.restlet.engine.adapter.ServerAdapter.commit (ServerAdapter . java: 196) bei org.restlet.engine.adapter.HttpServerHelper.handle (HttpServerHelper.java:153) bei org.restlet.ext.jetty.JettyServerHelper $ WrappedServer.handle (JettyServerHelper.java:170) bei org.eclipse.jetty.server.AbstractHttpConnection.handleRequest (AbstractHttpConnection.java:452) bei org.eclipse.jetty.server.AbstractHttpConnection.content (AbstractHttpConnection.java:894) bei org.eclipse.jetty.server .AbstractHttpConnection $ RequestHandler.content (AbstractHttpConnection.java:948) bei org.eclipse.jetty.http.HttpParser.parseNext (HttpParser.java:943) um org.eclipse.jetty.http.HttpParser.parseAvailable (HttpParser.java : 235) bei org.eclipse.jetty.server.AsyncHttpConnection.handle (AsyncHttpConnection.java:77) bei org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle (SelectChannelEndPoint.java:622) bei org .eclipse.jetty.io.nio.SelectChannelEndPoint $ 1.run (SelectChannelEndPoint.java:46) bei org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:603) bei org.eclipse. jetty.util.thread.QueuedThreadPool $ 3.run (QueuedThreadPool.java:538) bei java.lang.Thread.run (Thread.java:722)

Wenn das passiert, hängt der Client auf unbestimmte Zeit.

Hier ist ein Codebeispiel, das das Problem reproduziert:

Server-Seite:

public static void main(String[] args) throws Exception { 
     Context context = new Context(); 
     Server server = new Server(context, Protocol.HTTP, 8182, DummyServerResource.class); 
     server.start(); 
    } 

public class DummyServerResource extends ServerResource { 

    @Get 
    public String retrieve() throws InterruptedException { 
     Thread.sleep(1000 * 20); 
     return "Dummy"; 
    } 
} 

Client-Seite:

public static void main(String[] args) throws IOException, InterruptedException { 
    Context context = new Context(); 
    context.getParameters().add("maxIoIdleTimeMs", "0"); 
    Client client = new Client(context, Protocol.HTTP); 
    ClientResource cr = new ClientResource("http://localhost:8182"); 
    cr.setNext(client); 
    Representation get = cr.get(); 
    System.out.println(get.getText()); 
    Thread.sleep(1000 * 50); 
    ClientResource cr2 = new ClientResource("http://localhost:8182"); 
    cr2.setNext(client); 
    Representation get2 = cr2.get(); 
    System.out.println(get2.getText()); 

} 

Was hier vor sich geht und wie beseitige ich den Fehler ?

Antwort

0

Was passiert ist, dass der Server den Leerlauf-Socket nach 30 Sekunden standardmäßig schließt und nicht versucht, einen neuen zu öffnen.

Die Problemumgehung, die ich gefunden habe, ist, den Parameter ioMaxIdleTimeMs auf 0 zu setzen, was bedeutet, dass kein Timeout auftritt. Hier

ist der Arbeitsservercode:

public static void main(String[] args) throws Exception { 
    Context context = new Context(); 
    context.getParameters().add("maxIoIdleTimeMs", "0"); 
    context.getParameters().add("ioMaxIdleTimeMs", "0"); 
    Server server = new Server(context, Protocol.HTTP, 8182, DummyServerResource.class); 
    server.start(); 
} 

Bitte beachte, dass ich beide maxIoIdleTimeMs und ioMaxIdleTimeMs gesetzt. In meinem Fall wird ioMaxIdleTimeMs verwendet. Es ist der Parameter, der von Jetty verwendet wird.

Aber wenn Sie mit Jetty nicht, vermute ich, es könnte die Parameter maxIoIdleTimeMs in org.restlet.engine.connector.BaseHelper.java definiert verwenden