SocketTimeoutException和Jetty问题

时间:2012-02-12 04:25:16

标签: java http servlets jetty

我正在使用基于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(我很确定我正在使用)默认是持久的。

所以我认为有两种方法可以解决这个问题:

  1. 弄清楚如何防止超时异常 扔了所有
  2. 让客户端发出初始请求而无需等待 对于响应,然后使用单独的请求ping以检查何时 服务器完成了。

    更新(2012年2月12日):我将maxIdleTime设置为Tim建议,并确实延长了超时发生前的时间,但后来我开始获得新的异常:

  3.   

    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请求进行轮询,以检查服务器上的操作何时完成。

1 个答案:

答案 0 :(得分:4)

这是一个套接字超时,所以你在HTTP级别所做的任何事情都无法修复它 - 因此你的活着没有实现任何目标。

尝试在maxIdleTime

上设置SocketConnector

请参见此处:http://docs.codehaus.org/display/JETTY/Configuring+Connectorsarchive link