2012-10-17 10 views
5

私は、クライアントに応答するのに時間がかかる可能性のあるサーバーへの要求を行っています。接続が切れたRestletサーバーソケットタイムアウト

:サーバーは、それが次の例外を投げていた返信したかった

。おそらくクライアントによって閉鎖されていたでしょう。 org.eclipse.jetty.http.AbstractGenerator.blockForOutputでorg.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:435) (AT

org.eclipse.jetty.io.EofException (HttpOutput.java:159)at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:101)at sun。org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:159)での sun。 nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)at 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) (OutputStreamWriter.java:220) のjava.io.Writer.write(Writer.java:157) のorg.restlet.representation.StringRepresentation.write(StringRepresentation.java:237)のjava.io.OutputStreamWriter.write でorg.restlet.representation.CharacterRepresentation.write(CharacterRepresentation.java:76) org.restlet.engine.adapter.ServerCall.writeResponseBody(ServerCall.java:509) でorg.restlet.engine.adapterで org.restlet.engine.adapter.ServerAdapter.commitで.ServerCall.sendResponse org.restlet.ext.jetty.internal.JettyCall.sendResponse(JettyCall.java:312)で(ServerCall.java:453) (ServerAdapter 。 Javaの:196) で でorg.restlet.ext.jetty.JettyServerHelper $ WrappedServer.handle(JettyServerHelper.java:170)org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:153) で 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) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:943)at 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 java.lang.Thread.runで(QueuedThreadPool.java:538) (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()); 

} 

ここで起こっているとどのように私はエラーをなくすかどう?

答えて

0

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

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

作業サーバーコードです:私はmaxIoIdleTimeMsとioMaxIdleTimeMsの両方を設定し

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

注意。 私の場合、使用されているのはioMaxIdleTimeMsです。これはJettyによるパラメータの使用です。

しかし、あなたは桟橋を使用していない場合、私はそれがorg.restlet.engine.connector.BaseHelper.java

で定義されたパラメータmaxIoIdleTimeMsを使用する場合があります疑います
関連する問題