2012-10-17 54 views
5

Tôi đang yêu cầu một khách hàng thực hiện yêu cầu tới một máy chủ có thể mất một thời gian để phản hồi.Thời gian chờ của máy chủ Restlet

Khi máy chủ muốn trả lời nó đã được ném ngoại lệ sau đây:

Kết nối bị hỏng. Nó có lẽ đã bị đóng bởi khách hàng.

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

Khi điều đó xảy ra, khách hàng bị treo vô thời hạn.

Dưới đây là một ví dụ mã mà tái tạo các vấn đề:

Server side:

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"; 
    } 
} 

phía Chủ đầu tư:

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

} 

gì đang xảy ra ở đây và làm thế nào để loại bỏ lỗi ?

Trả lời

0

Điều xảy ra là máy chủ đóng socket không hoạt động sau 30 giây theo mặc định và không cố gắng mở lại một ổ cắm mới.

Cách khắc phục mà tôi tìm thấy là đặt tham số ioMaxIdleTimeMs thành 0 có nghĩa là không có thời gian chờ.

Đây là mã máy chủ làm việc:

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

Lưu ý rằng tôi đặt cả maxIoIdleTimeMs và ioMaxIdleTimeMs. Trong trường hợp của tôi là ioMaxIdleTimeMs được sử dụng. Nó là tham số sử dụng bởi Jetty.

Nhưng nếu bạn không sử dụng Jetty, tôi nghi ngờ nó có thể sử dụng tham số maxIoIdleTimeMs được định nghĩa trong org.restlet.engine.connector.BaseHelper.java

Các vấn đề liên quan