你能有嵌套的异步上下文吗?

Can you have nested asynchronous contexts?

因此,如果 AsyncContext::complete 关闭 响应并且我需要在异步上下文中编写响应,我该如何实现多步响应,其中 一些 步阻塞,中间有非阻塞部分?

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

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

特别是

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

,基本答案是"however you want"。 AsyncContext 既不会阻碍也不会特别帮助您,因为它是关于与容器的通信,而不是关于工作流。特别是,我认为嵌套 AsyncContexts.

没有必要或没有特殊用途

我认为您描述的是具有特定的有限并行化的处理管道。例如,您可以通过 运行 在通过 AsyncContext::start 启动的线程中 运行 整合整个工作流程——所有 "blocking" 步骤,并将其他工作分派给线程池,以任何有意义的单位。但是请注意,请求和响应对象不是线程安全的。理想情况下,主线程将从请求中提取所有需要的数据,并对响应执行所有需要的写入。

或者,您可以为主要工作流程使用常规请求处理线程,适当地将工作分派到线程池,并完全跳过 AsyncContext 位。绝对没有必要使用 AsyncContext 在 Web 应用程序中执行异步计算——它的目的和它旨在支持的处理模型要具体得多。