Jetty不会关闭超时连接

时间:2016-02-29 10:38:29

标签: jetty embedded-jetty

我正在使用jetty-9。

我的配置是:connector.setIdleTimeout(20000)

我的码头处理程序是:

public void handle(String target, Request baseRequest,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    // TODO Auto-generated method stub


    AsyncContext ctx = request.startAsync();
    ctx.setTimeout(0);

     XXXXX...(Other process with ctx)
}

但是在30多岁之后,码头只会打印日志:

DEBUG [org.eclipse.jetty.io.WriteFlusher]:  ignored: WriteFlusher@7cc4b130{IDLE} java.util.concurrent.TimeoutException: Idle timeout expired: 20004/20000 ms

DEBUG [org.eclipse.jetty.io.AbstractEndPoint]:  Ignored idle endpoint SelectChannelEndPoint@387b2c97{/127.0.0.1:59889<->8088,Open,in,out,-,-,20005/20000,HttpConnection}{io=0/0,kio=0,kro=1}

连接未关闭但处于活动状态。我仍然可以使用“ctx”将rsp发送给客户端。
有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:3)

此处的行为取决于XXXX处理的内容。如果XXXX处理仍在运行,则AsyncContext超时不会触发,因为只有在调度到servlet的线程返回容器时才会激活它。

因此,如果XXX正在做很多事情或者正在睡觉,那么超时就不会起作用了。

此外,javadoc表示超时为0或更低意味着没有超时!所以尝试使用timeout(1)或一些小值。

编辑: 此外,一旦调度了servlet,连接器空闲超时仅适用于阻止IO操作。因此,如果您没有使用阻塞API进行读取或写入,则连接器空闲超时也不适用。

servlet规范基本上信任servlet永远不会无限 - 容器不允许在处理时间上施加空闲超时。很久以前,Jetty曾经在这种情况下中断servlet,但我们毫不含糊地被告知它违反了规范。