Tomcat7 不等待异步请求在关闭时完成其工作

Iho*_* M. 4 tomcat tomcat7

汤姆猫版本:7.0.92

我在 Tomcat 7 上运行的应用程序中大量使用异步 API。我的要求之一是允许当前正在进行的所有请求在终止之前完成其工作。

我为每个连接器设置了以下属性server.xml asyncTimeout="40000" executorTerminationTimeoutMillis="60000"

另外,unloadDelay在 中设置为 60 秒context.xml

我已经让我的一项服务休眠 10 秒,并向我的服务器发出了一个 curl 请求,然后立即请求关闭 tomcat 服务。

curl 在那里停留大约 10 秒,然后502从 tomcat 返回。

此外,在 中catalina.out,我看到以下堆栈跟踪:

INFO: Waiting for 1 instance(s) to be deallocated for Servlet [jersey-servlet]
Dec 05, 2018 7:13:37 PM org.apache.catalina.connector.CoyoteAdapter checkRecycled
INFO: Encountered a non-recycled request and recycled it forcedly.
org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException
    at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:634)
    at org.apache.coyote.http11.AbstractHttp11Processor.recycle(AbstractHttp11Processor.java:1909)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.release(Http11NioProtocol.java:220)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:720)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1775)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1734)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

Encountered a non-recycled request and recycled it forcedly.

我相信这表明有些东西没有按预期工作。HTTP 连接器似乎被过早关闭了。

spa*_*iev 5

只是“为了完整性:

根据问题作者提交的 Tomcat bug - https://bz.apache.org/bugzilla/show_bug.cgi?id=63003

所描述的问题是由 Tomcat 不尊重unloadDelay上下文设置引起的,目前已经修复。