【发布时间】:2016-01-04 14:23:32
【问题描述】:
我有点困惑 servlet 容器如何在应用程序取消部署阶段终止 AsyncContext 或只是超时。例如应用程序开发人员有以下代码sn-p:
@WebServlet(name = "MyServlet", urlPatterns = "/myServlet", asyncSupported = true)
public class MyServlet extends HttpServlet {
private static Logger log = Logger.getLogger(MyServlet.class);
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
AsyncContext asyncContext = request.startAsync();
asyncContext.start(new Runnable() {
@Override
public void run() {
log.debug("Start of Task");
try {
while(true) {
response.getWriter().println("random text");
Thread.sleep(100);
}
}catch(Exception e) {
log.warn("Async processing exception: " + e.getMessage);
}
asyncContext.complete();
log.debug("End of Task");
}
});
}
}
这里是 AsyncContext 开始可运行,永远不会结束,或者直到在 while 循环中抛出一些异常。所以问题是容器将如何终止运行如此无限可运行的线程。想到的唯一想法是thread.stop();,但它已被弃用。我几乎可以肯定容器不会调用 thread.interrupt();,因为它不保证引用 javadoc 的线程中断,并且开发人员在这里设置条件 while-true 而不是 while-not-interrupted 因此不对这种情况负责。
任何建议表示赞赏。
【问题讨论】:
-
为什么容器应该终止这样一个可运行的(如果它故意使用无限while循环)?
-
@SabirKhan 如果管理员决定使用 CLI lib/web UI 或其他方式从 sevlet 容器中取消部署应用程序怎么办。让线程继续运行?
-
您可以覆盖destroy 方法并按照您想要的方式完成您的对象。
标签: java multithreading jakarta-ee asynchronous servlet-3.0