java - 可以嵌套异步上下文吗?

标签 java asynchronous servlets jakarta-ee blocking

所以如果 AsyncContext::complete 关闭响应,并且我需要在异步上下文中编写响应,如何实现多步骤响应,其中一些步骤被阻塞,而其中的非阻塞部分-他们之间?

最佳答案

您似乎对 AsyncContext 的性质和 ServletRequest::startAsync 的语义有误解。此方法(重新)初始化请求和关联响应的 AsyncContext,如果需要,首先创建一个,并将其与请求/响应对关联。这会将请求置于异步模式,其核心意味着容器在调用所提供上下文的 complete() 方法之前不会认为请求处理已完成

特别是,创建异步上下文不会创建任何线程或将关联的请求分配给不同的线程,并且 AsyncContext 的方法在调用它们的线程上运行(尽管这有点像AsyncContext::start 的技术细节)。上下文主要是您提供的用于与容器交互的任何异步代码的对象,否则它无法安全地进行交互。要实际在其他线程上执行处理,需要安排该线程的存在,并将工作分配给它。 AsyncContext::start 是一种方便的方法,但不是唯一的方法。

特别尊重

how do I implement a multi-step response in which some steps are blocking with non-blocking sections in-between them?

,基本答案是“随你所欲”。 AsyncContext 既不会阻碍也不会特别帮助您,因为它是关于与容器的通信,而不是关于工作流程。特别是,我认为嵌套 AsyncContext 没有必要或有特殊用途。

我认为您正在描述具有某些有限并行性的处理管道。例如,您可以通过在通过 AsyncContext::start 启动的线程中运行整个工作流程(我猜是所有“阻塞”步骤)并将其他工作分派(dispatch)到线程来实现这一点池,以任何有意义的单位。但请注意,请求和响应对象不是线程安全的。理想情况下,主线程将从请求中提取所有需要的数据,并对响应执行所有需要的写入。

或者,您可以在主工作流程中使用常规请求处理线程,根据需要将工作片段分派(dispatch)到线程池,并完全跳过 AsyncContext 位。在任何绝对意义上都没有必要使用 AsyncContext 在 Web 应用程序中执行异步计算 - 它的目的和它设计支持的处理模型更加具体。

关于java - 可以嵌套异步上下文吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54221192/

相关文章:

java - 将实例变量传递给静态方法——并修改另一个实例变量?

python - 如何在异步中并发运行任务?

java - 标准表单例份验证 Java servlet

java - servlet 与数据库的连接

javascript - 有条件地调用一个 promise (或不调用),但将任一结果返回给另一个 promise

javascript - 从 anchor html 标记调用 javascript 函数

java - Java中的不可打印字符

java - java如何对一个数进行因式分解

java - 使用 HTMLUnit 和 XPath 获取跨度元素列表的内容

.net - 为什么TaskFactory.StartNew Task没有立即启动?