Restlet服务器套接字超时

ava*_*eme 5 restlet

我有一个客户端向服务器发出请求,这可能需要一些时间来响应.

当服务器想要回复时,它抛出以下异常:

连接断了.它可能被客户关闭了.

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

当发生这种情况时,客户端会无限期挂起.

这是一个重现问题的代码示例:

服务器端:

    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";
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端:

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());

}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,如何消除错误?

dev*_*mao 2

几周前我在 GitHub 上提出了一个有关此问题的问题。感谢分享。 https://github.com/restlet/restlet-framework-java/issues/675