因此,如果AsyncContext::complete
关闭,并且我需要在异步上下文中编写响应,那么我该如何实现一个多步响应,其中 some 步骤之间是否被非阻塞部分阻塞?
答案 0 :(得分:1)
您似乎在误解AsyncContext
的性质和ServletRequest::startAsync
的语义。此方法(重新)为请求和关联的响应初始化AsyncContext
,必要时首先创建一个complete()
并将其与请求/响应对关联。这会将请求置于异步模式 ,它的核心含义是直到调用提供的上下文的AsyncContext
方法,容器才会认为请求处理已完成 < / strong>。
特别是,创建异步上下文不会创建任何线程或将关联的请求分配给其他线程,并且AsyncContext::start
的方法在调用它们的线程上运行(尽管这对于{ {1}})。上下文主要是您提供的用于与容器交互的任何异步代码的对象,否则它将无法安全地执行此操作。要在其他线程上实际执行处理,您需要安排该线程存在,并为其分配工作。 AsyncContext::start
是一种方便的方法,但不是唯一的方法。
专门针对
我如何实现多步响应,其中某些步骤被它们之间的非阻塞部分阻塞了?
,基本答案是“无论您想要什么”。 AsyncContext
既无碍也无济于事,因为它与容器进行通信,而不是工作流程。特别是,我认为不需要嵌套AsyncContext
来使用它们。
我认为您正在描述具有某些有限并行化的处理管道。例如,您可能会通过在通过AsyncContext::start
启动的线程中运行整个工作流程(我想是所有“阻塞”步骤)并将其他工作分派到线程池中来实现,感。但是请注意,请求和响应对象不是线程安全的。理想情况下,主线程将从请求中提取所有需要的数据,并对响应执行所有必要的写操作。
或者,也许您将常规请求处理线程用于主要工作流程,将工作分配到相应的线程池,然后完全跳过AsyncContext
位。绝对没有必要在Web应用程序中使用AsyncContext
来执行异步计算-它的目的和设计要支持的处理模型要明确得多。