Tomcat7 不等待异步请求在关闭时完成其工作
Tomcat7 is not waiting for async requests to complete their work on shutdown
Tomcat版本:7.0.92
我在我的应用程序中大量使用异步 API,即 运行 on Tomcat 7。
我的要求之一——允许所有当前正在进行的请求在终止前完成它们的工作。
我为 server.xml
中的每个连接器设置了以下属性: asyncTimeout="40000" executorTerminationTimeoutMillis="60000"
此外,unloadDelay
在 context.xml
中设置为 60 秒。
我在我的一项服务中休眠了 10 秒,然后我对我的服务器发出了 curl 请求,然后我立即请求关闭 tomcat 服务。
curl 在那里停留了大约 10 秒,然后它从 tomcat.
returns 502
此外,在 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)
Encountered a non-recycled request and recycled it forcedly.
我认为这表明某些东西没有按预期工作。似乎 HTTP 连接器被过早关闭。
只是“为了完整起见:
根据问题作者提交的这个Tomcat bug - https://bz.apache.org/bugzilla/show_bug.cgi?id=63003
所描述的问题是由 Tomcat 不遵守 unloadDelay
上下文设置引起的,现在已经修复。
Tomcat版本:7.0.92
我在我的应用程序中大量使用异步 API,即 运行 on Tomcat 7。 我的要求之一——允许所有当前正在进行的请求在终止前完成它们的工作。
我为 server.xml
中的每个连接器设置了以下属性: asyncTimeout="40000" executorTerminationTimeoutMillis="60000"
此外,unloadDelay
在 context.xml
中设置为 60 秒。
我在我的一项服务中休眠了 10 秒,然后我对我的服务器发出了 curl 请求,然后我立即请求关闭 tomcat 服务。
curl 在那里停留了大约 10 秒,然后它从 tomcat.
returns502
此外,在 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)
Encountered a non-recycled request and recycled it forcedly.
我认为这表明某些东西没有按预期工作。似乎 HTTP 连接器被过早关闭。
只是“为了完整起见:
根据问题作者提交的这个Tomcat bug - https://bz.apache.org/bugzilla/show_bug.cgi?id=63003
所描述的问题是由 Tomcat 不遵守 unloadDelay
上下文设置引起的,现在已经修复。