- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有点困惑 servlet 容器如何在应用程序取消部署阶段或只是超时终止 AsyncContext。例如应用程序开发人员有以下代码片段:
@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 因此不对此类情况负责。
任何建议表示赞赏。
最佳答案
如果应用程序开发人员故意使其无限循环,则 Web 容器无法执行任何操作来强制关闭线程。
幸运的是,应用程序员可以使用多种机制来确保 AsyncContext
不会无限运行。我脑海中的一些想法是:
AsyncContext.setTimeout(long)
为请求设置超时destory()
方法并调用 AsyncContext.complte()
,这将在每个监听器上调用 AsyncListener.onComplete(AsyncEvent)
.在使用 AsyncContext.addListener(AsyncListener)
添加监听器后,您可以附加一个停止进程的监听器。destory()
方法中停止它。主要思想是,如果您要编写一个无限循环的线程(并且您关心在关闭时停止线程),您将需要编写一些代码来确保您的线程正确停止。
有可能 AsyncContext.start(Runnable)
使用的线程来自托管线程池:
AsyncContext.start(Runnable)
: Causes the container to dispatch a thread, possibly from a managed thread pool, to run the specified Runnable.
但是,由于规范对此并不明确,您需要手动调查您的 Java EE 实现如何解释该位以查看它是否使用托管线程。如果是这样,您的线程可能会在应用服务器停止时自动为您停止。
关于java - AsyncContext 无限线程终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34593273/
我有点困惑 servlet 容器如何在应用程序取消部署阶段或只是超时终止 AsyncContext。例如应用程序开发人员有以下代码片段: @WebServlet(name = "MyServlet",
我们有一个带有仪表板的 Web 应用程序,它不断地轮询更新。在服务器端,更新请求是异步的,因此我们可以通过监听器/通知系统在发生更新时做出响应。 我们看到的问题是,当其中一个轮询请求得到响应时,在某些
关于:AsyncContextThread https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext https://github.com/
首先我想说英语不是我的母语,所以如果我犯了一些明显的错误或者有些地方不够清晰,请原谅。问题: 最近我被转移到一个新项目,我们正在开发一个 Java EE 应用程序,该应用程序通过 Jersey+Hib
虽然 Servlet 3.0 规范有 request.startAsync() 和 asyncContext.start(),为什么它没有提供 asyncContext.stop() 或 asyncC
我正在使用 Spring 的 OncePerRequestFilter 覆盖 shouldNotFilterAsyncDispatch 方法以返回 false。这样它就可以处理异步请求。在过滤器中,我
我目前正在学习网站编程,准确地说是使用 javascript 的 java servlet,我刚刚学习了如何在单个 servlet 中使用 AsyncContext。例如,我想知道是否可以在 serv
我关注了this教程并实现了一个简单的聊天应用程序。我正在最新的 Mozilla Firefox 和 Google Chrome 浏览器中对其进行测试。 我主要担心的是消息交换似乎不是实时发生的。即使
我在我的控制台应用程序中调用一个异步方法。我不希望应用程序在启动后不久退出,即在等待任务完成之前退出。看来我可以这样做: internal static void Main(string[] args
我几乎可以肯定,但最好澄清一下:如果 Runnable 在 servlet 请求的 AsyncContext 中启动,那么代码是在run方法线程安全吗?我想是的。因为每个线程都有一个新的 Runnab
我正在使用 Servlet 3.0 的 javax.servlet.AsyncContext 实现服务器发送的事件界面。 但是我不明白我应该如何处理 I/O 错误,例如 peer disconnect
我创建了一个 servlet 3.0 来探索异步请求处理: @WebServlet(name="MyTest", urlPatterns={"/MyTest"}, asyncSupported=tru
AsyncContext 的文档有这个同步工作的例子(只是稍微修改,但仍然有效): #include "napi.h" void MakeCallbackWithAsyncContext(const
当我们使用 servlet3 规范中提到的 AsyncContext 时,http 连接保持打开状态多长时间?我的一段代码是 final AsyncContext asyncContext = htt
我需要 Web/JavaEE 容器中的一个线程来从外部源获取信息并在同一 JVM 中完成相应的 AsyncContext 对象。 我希望有一个零延迟的解决方案,因此排除了定期轮询或计时器。 我可以启动
我点击了链接 http://wiki.eclipse.org/Jetty/Tutorial/Jetty_HelloWorld教程(使用 Eclipse)。并查看了现有的 stackoverflow h
我正在使用 intellij idea 终极版 12..4 Grails 2.2.0 , buildConfig.groovy 文件中的 grails.servlet.version = "2.5"
我正在尝试遵循http://wiki.eclipse.org/Jetty/Tutorial/Jetty_HelloWorld教程(使用 Eclipse)。该项目编译良好。但是,当我访问本地主机服务器时
我已成功运行 Java servlet 应用程序测试,该应用程序在 Amazon AWS Elastic BeansTalk 提供的基本示例应用程序上运行。 Java-Gradle-Jetty 平台。
以此处回答的几个示例和问题为主导(主要是 http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ),我想让服
我是一名优秀的程序员,十分优秀!