【问题标题】:Jetty doesn't close the timeout connectionJetty 不关闭超时连接
【发布时间】:2016-02-29 10:38:29
【问题描述】:

我正在使用 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}

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

【问题讨论】:

  • Jetty 9 的具体版本是什么?
  • 谢谢! Jetty 版本为 9.3.5.v20151012。

标签: jetty embedded-jetty


【解决方案1】:

此处的行为将取决于 XXXX 处理的作用。如果 XXXX 处理仍在运行,则不会触发 AsyncContext 超时,因为它仅在分派到 servlet 的线程返回容器后才会激活。

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

javadoc 还说超时 0 或更少意味着没有超时!所以尝试使用 timeout(1) 或一些小的值。

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

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

【讨论】:

  • 非常感谢! (1)AsyncContext的超时=0,我的目的是在我的应用程序中自己控制超时,例如:发送带有timeout_errorcode的rsp (2)“XXXX处理”很简单:ResponseFuture future = dispatcher.dispatch(ctx);未来.setListener(回调); baseRequest.setHandled(true);所以,“handle”方法会很快返回,应用程序的线程池将获取 rsp 并调用回调(发送到客户端) (3) 此外,如果我想关闭过期的连接,我该怎么办?如果客户端没有关闭连接,服务器将耗尽 socket_fd。期待您的指导!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2014-01-11
  • 1970-01-01
相关资源
最近更新 更多