我正在使用基于Jetty的servlet来执行RPC,我遇到一个问题,即需要很长时间的请求会在服务器上抛出以下异常:
2012-02-11 21:07:07,673 [btpool0-4] DEBUG org.mortbay.log - EXCEPTION java.net.SocketTimeoutException:读取超时 在java.net.SocketInputStream.socketRead0(本机方法) 在java.net.SocketInputStream.read(未知来源) 在org.mortbay.io.ByteArrayBuffer.readFrom(ByteArrayBuffer.java:168) 在org.mortbay.io.bio.StreamEndPoint.fill(StreamEndPoint.java:99) 在org.mortbay.jetty.bio.SocketConnector $ Connection.fill(SocketConnector 的.java:190) 在org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:277) 在org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:203) 在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357) 在org.mortbay.jetty.bio.SocketConnector $ Connection.run(SocketConnector。 Java的:217) 在org.mortbay.thread.BoundedThreadPool $ PoolThread.run(BoundedThreadPool) .java:475)2012-02-11 21:07:07,674 [btpool0-4] DEBUG org.mortbay.log - EOF
我尝试设置Connection,Keep-Alive http请求属性,但是没有效果,而且我可以收集的内容,http 1.1(我很确定我正在使用)默认是持久的。
所以我认为有两种方法可以解决这个问题:
让客户端发出初始请求而无需等待 对于响应,然后使用单独的请求ping以检查何时 服务器完成了。
更新(2012年2月12日):我将maxIdleTime设置为Tim建议,并确实延长了超时发生前的时间,但后来我开始获得新的异常:
2012-02-11 23:24:01,187 [btpool0-1] DEBUG org.mortbay.log - EXCEPTION java.io.IOException:现有连接被强制关闭 sun.nio.ch.SocketDispatcher.read0(Native Method)的远程主机 sun.nio.ch.SocketDispatcher.read(未知来源)at sun.nio.ch.IOUtil.readIntoNativeBuffer(未知来源)at sun.nio.ch.IOUtil.read(未知来源)at sun.nio.ch.SocketChannelImpl.read(未知来源)at org.mortbay.io.nio.ChannelEndPoint.fill(ChannelEndPoint.java:129)at at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:277)at at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:203)at at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357)at at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:329) 在 org.mortbay.thread.BoundedThreadPool $ PoolThread.run(BoundedThreadPool.java:475)
因此Jetty之外的东西正在破坏连接,我怀疑很可能是防火墙。所以我最终做的是让服务器处理多个线程的请求;原始线程会立即响应http请求,第二个线程将被启动以执行花费很长时间的操作。然后,客户端将使用http请求进行轮询,以检查服务器上的操作何时完成。
答案 0 :(得分:4)
这是一个套接字超时,所以你在HTTP级别所做的任何事情都无法修复它 - 因此你的活着没有实现任何目标。
尝试在maxIdleTime
SocketConnector
请参见此处:http://docs.codehaus.org/display/JETTY/Configuring+Connectors(archive link)