Jetty 码头不';t关闭超时连接

Jetty 码头不';t关闭超时连接,jetty,embedded-jetty,Jetty,Embedded Jetty,我使用的是jetty-9 我的配置是:connector.setIdleTimeout(20000) 我的码头装卸工是: public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // TODO Auto-gene

我使用的是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秒后,jetty只打印如下日志:

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}
DEBUG[org.eclipse.jetty.io.WriteFlusher]:已忽略:WriteFlusher@7cc4b130{IDLE}java.util.concurrent.TimeoutException:空闲超时已过期:20004/20000毫秒
调试[org.eclipse.jetty.io.AbstractEndPoint]:忽略空闲端点SelectChannelEndPoint@387b2c97{/127.0.0.1:598898088,Open,in,out,-,20005/20000,HttpConnection}{io=0/0,kio=0,kro=1}
连接未关闭,但处于活动状态。我仍然可以使用“ctx”将rsp发送到客户端。

有人能帮我吗?

这里的行为将取决于XXXX处理的功能。如果XXXX处理仍在运行,则不会触发AsyncContext超时,因为它仅在分派给servlet的线程返回容器时激活

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

javadoc还说,0或更小的超时意味着没有超时!因此,尝试使用timeout(1)或一些较小的值

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


servlet规范基本上相信servlet永远不会无限大——不允许容器在处理时间上施加空闲超时。很久以前,Jetty曾在这种情况下中断servlet,但我们被明确告知这违反了规范。

Jetty 9的具体版本是什么?谢谢!Jetty版本是9.3.5.v20151012。非常感谢!(1) AsyncContext的timeout=0,我的目的是在我的应用程序中自己控制超时,例如:发送一个带有超时的rsp\u错误代码(2)“XXXX处理”很简单:ResponseFuture=dispatcher.dispatch(ctx);setListener(回调);baseRequest.setHandled(true);因此,“handle”方法将快速返回,应用程序的线程池将获取rsp并调用回调(发送到客户端)(3)此外,如果我想关闭过期的连接,我该怎么办?如果客户端未关闭连接,服务器将耗尽套接字。期待您的指导!