我们有一个长期工作的doPost
方法,可以阻止Jetty线程
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
// long prepare answer (which depends on external sources wait)
// here must be something like yield
PrintWriter out = response.getWriter();
out.println(answer);
}
有没有办法异步进行长时间准备并在那里完成另一个Jetty任务?
答案 0 :(得分:1)
您将要使用Servlet规范的2个功能。
AsyncContext
- Servlet规范的异步处理功能 - 允许您暂停活动处理,直到您实际拥有一些内容来生成响应。 (这是一个过度简化,但你得到了要点)HttpServletResponse.getOutputStream().setWriteListener(WriteListener)
- Servlet规范的异步I / O特性 - 用于异步生成/写回客户端的响应。 (这也是一种简化,但是be aware of the gotchas when working with this)答案 1 :(得分:1)
您想使用Jetty的Continuation API。基本上,延续是一种机制,您可以以异步方式启动可能长时间运行的操作,然后释放处理当前请求的Jetty线程。异步操作完成后,使用continuation继续处理请求,此时您可以完成响应。见Continuation