2012-10-17 21 views
5

मेरे पास क्लाइंट एक सर्वर से अनुरोध कर रहा है जिसमें जवाब देने में कुछ समय लग सकता है।रीसेट सर्वर सॉकेट टाइमआउट

कनेक्शन टूट गया था:

सर्वर उत्तर देने के लिए यह निम्न अपवाद फेंक दिया गया था चाहता था जब। यह शायद ग्राहक द्वारा बंद कर दिया गया था।

org.eclipse.jetty.http.AbstractGenerator.blockForOutput पर org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable (SelectChannelEndPoint.java:435) पर org.eclipse.jetty.io.EofException (AbstractGenerator.javaox12) org.eclipse.jetty.server.HttpOutput.write (HttpOutput.java:159) org.eclipse.jetty.server.HttpOutput.write (HttpOutput.java:101) सूर्य पर। sun.nio.cs.StreamEncoder.implWrite (StreamEncoder.java:282) पर sun.nio.cs.StreamEncoder.write (StreamEncoder.java:125) पर nio.cs.StreamEncoder.writeBytes (StreamEncoder.java2121) sun.nio.cs.StreamEncoder.write (StreamEncoder.java:135) पर java.io.OutputStreamWriter.write (आउटपुटस्ट्रीमवाइटर.जावा 2020) java.io.Writer.write (Writer.java:157) org.restlet.representation.StringRepresentation.write (StringRepresentation.java3737) पर 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 । जावा: 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.parseAvailable पर org.eclipse.jetty.http.HttpParser.parseNext (HttpParser.java:943) पर (HttpParser.java : 235) org.eclipse.jetty.server.AsyncHttpConnection.handle (AsyncHttpConnection.java:77 पर ) org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle (SelectChannelEndPoint.java:622 पर ) पर ऑर्ग .eclipse.jetty.io.nio.SelectChannelEndPoint org.eclipse पर org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:603) पर $ 1.run (SelectChannelEndPoint.java:46) । 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()); 

} 

यहाँ क्या हो रहा है और मैं त्रुटि कैसे खत्म करने है ?

उत्तर

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 का उपयोग किया जाता है। जेटी द्वारा पैरामीटर का उपयोग यह है।

लेकिन अगर आप जेट्टी का उपयोग नहीं कर रहे हैं, मुझे लगता है यह पैरामीटर maxIoIdleTimeMs org.restlet.engine.connector.BaseHelper.java

में परिभाषित का उपयोग कर सकते
संबंधित मुद्दे