5

クライアントがサーバーにリクエストを行っていますが、応答に時間がかかる場合があります。

サーバーが応答しようとすると、次の例外がスローされました。

接続が切断されました。クライアントによって閉じられた可能性があります。

org.eclipse.jetty.io.EofException at org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:435) at org.eclipse.jetty.http.AbstractGenerator.blockForOutput(AbstractGenerator.java:512) at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:159) at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:101) at 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. org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler の eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894)。content(AbstractHttpConnection.java:948) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:943) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse .jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1. run(SelectChannelEndPoint.java:46) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538) ) java.lang.Thread.run(Thread.java:722) でjetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) at 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) でjetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622) at 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) でjava.lang.Thread.run(Thread.java:722) で QueuedThreadPool$3.run(QueuedThreadPool.java:538)java.lang.Thread.run(Thread.java:722) で QueuedThreadPool$3.run(QueuedThreadPool.java:538)

その場合、クライアントは無期限にハングします。

問題を再現するコード例を次に示します。

サーバ側:

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

}

ここで何が起こっているのか、どうすればエラーを解消できますか?

4

2 に答える 2

2

私は数週間前に GitHub でそれに関するイシューをオープンしました。共有してくれてありがとう。 https://github.com/restlet/restlet-framework-java/issues/675 .

于 2012-10-24T15:18:54.840 に答える
0

何が起こるかというと、サーバーはデフォルトで 30 秒後にアイドリング ソケットを閉じ、新しいソケットを再び開かないようにします。

私が見つけた回避策は、ioMaxIdleTimeMsパラメーターを 0 に設定することです。これは、タイムアウトがないことを意味します。

動作中のサーバーコードは次のとおりです。

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

maxIoIdleTimeMs と ioMaxIdleTimeMs の両方を設定していることに注意してください。私の場合、使用されるのは ioMaxIdleTimeMs です。Jetty が使用するパラメータです。

しかし、Jetty を使用していない場合は、org.restlet.engine.connector.BaseHelper.java で定義されているパラメーター maxIoIdleTimeMs を使用していると思われます。

于 2016-09-12T18:47:46.043 に答える