我用的是jetty-9。
我的配置是:connector.setIdleTimeout(20000)。
我的jetty处理程序是:
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}连接没有关闭,但active.And I仍然可以使用"ctx“将rsp发送到客户端。
有人能帮我吗?
发布于 2016-02-29 23:26:07
这里的行为将取决于XXXX处理程序所做的工作。如果XXXX处理仍在运行,那么AsyncContext超时将不会触发,因为它只有在调度到servlet的线程返回到容器时才被激活。
因此,如果XXX正在做很多事情或者在睡觉,那么超时是不会起作用的。
javadoc还说,0或更小的超时意味着没有超时!因此尝试使用timeout(1)或一些较小的值。
编辑:此外,一旦分派了servlet,连接器空闲超时仅适用于阻塞IO操作。因此,如果您不使用阻塞API进行读取或写入,那么连接器空闲超时也不适用。
servlet规范基本上信任servlet永远不会变得无限-容器不允许在处理时间上施加空闲超时。很久以前,Jetty经常在这种情况下中断servlet,但我们被明确告知这与规范背道而驰。
https://stackoverflow.com/questions/35697435
复制相似问题