您可以嵌套异步上下文吗?

时间:2019-01-16 16:19:13

标签: java asynchronous servlets java-ee blocking

因此,如果AsyncContext::complete 关闭,并且我需要在异步上下文中编写响应,那么我该如何实现一个多步响应,其中 some 步骤之间是否被非阻塞部分阻塞?

1 个答案:

答案 0 :(得分:1)

您似乎在误解AsyncContext的性质和ServletRequest::startAsync的语义。此方法(重新)为请求和关联的响应初始化AsyncContext,必要时首先创建一个complete()并将其与请求/响应对关联。这会将请求置于异步模式 ,它的核心含义是直到调用提供的上下文的AsyncContext方法,容器才会认为请求处理已完成 < / strong>。

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

专门针对

  

我如何实现多步响应,其中某些步骤被它们之间的非阻塞部分阻塞了?

,基本答案是“无论您想要什么”。 AsyncContext既无碍也无济于事,因为它与容器进行通信,而不是工作流程。特别是,我认为不需要嵌套AsyncContext来使用它们。

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

或者,也许您将常规请求处理线程用于主要工作流程,将工作分配到相应的线程池,然后完全跳过AsyncContext位。绝对没有必要在Web应用程序中使用AsyncContext来执行异步计算-它的目的和设计要支持的处理模型要明确得多。