【发布时间】:2012-10-08 05:59:48
【问题描述】:
我有一个客户端向服务器发出请求,这可能需要一些时间才能响应。
当服务器想要回复时,它抛出了以下异常:
连接中断。它可能被客户端关闭了。
org.eclipse.jetty.io.EofException 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:435) 在 org.eclipse.jetty.http.AbstractGenerator.blockForOutput(AbstractGenerator.java:512) 在 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) 在 sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) 在 sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135) 在 java.io.OutputStreamWriter.write(OutputStreamWriter.java:220) 在 java.io.Writer.write(Writer.java:157) 在 org.restlet.representation.StringRepresentation.write(StringRepresentation.java:237) 在 org.restlet.representation.CharacterRepresentation.write(CharacterRepresentation.java:76) 在 org.restlet.engine.adapter.ServerCall.writeResponseBody(ServerCall.java:509) 在 org.restlet.engine.adapter.ServerCall.sendResponse(ServerCall.java:453) 在 org.restlet.ext.jetty.internal.JettyCall.sendResponse(JettyCall.java:312) 在 org.restlet.engine.adapter.ServerAdapter.commit(ServerAdapter.java:196) 在 org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:153) 在 org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:170) 在 org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452) 在 org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894) 在 org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948) 在 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.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) 在 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) 在 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";
}
}
客户端:
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());
}
这里发生了什么以及如何消除错误?
【问题讨论】:
标签: restlet