我正在使用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发送给客户端。
有人可以帮帮我吗?
答案 0 :(得分:3)
此处的行为取决于XXXX处理的内容。如果XXXX处理仍在运行,则AsyncContext超时不会触发,因为只有在调度到servlet的线程返回容器时才会激活它。
因此,如果XXX正在做很多事情或者正在睡觉,那么超时就不会起作用了。
此外,javadoc表示超时为0或更低意味着没有超时!所以尝试使用timeout(1)或一些小值。
编辑: 此外,一旦调度了servlet,连接器空闲超时仅适用于阻止IO操作。因此,如果您没有使用阻塞API进行读取或写入,则连接器空闲超时也不适用。
servlet规范基本上信任servlet永远不会无限 - 容器不允许在处理时间上施加空闲超时。很久以前,Jetty曾经在这种情况下中断servlet,但我们毫不含糊地被告知它违反了规范。