5. 异步请求
当一个web请求到达了Servlet容器时,Servlet线程将被阻碍直至处理执行完成。这种阻碍称为同步,我们需要通过一些方式来降低Servlet容器的负载。
5.1 Servlet 3.0 异步返回
Spring MVC支持Servlet 3.0提供的异步支持,它将web请求的处理放在另外一个线程中。我们由另外的线程来处理耗时的任务,而让Servlet线程被释放去处理另外的web请求,而不是阻碍Servlet线程。此时的返回(response)还是打开的,当处理完成后,将处理结果返回给客户端。
我们无需与Servlet API进行交互,Spring MVC支持DeferredResult
和Callable
作为控制器方法返回值提供单个值的异步返回。
Callable
:当异步运算结束后返回结果;
DeferredResult
: 结果由另外一个线程在稍后异步运算后返回。
5.1.1Callable
我们只需将控制器的方法的返回值设置为java.util.concurrent.Callable
即可,它会使用Spring MVC提供的TaskExecutor
(SimpleAsyncTaskExecutor
,线程名以MvcAsync
打头)来控制线程。
我们定义TaskService
用来演示处理:
@Service
@Slf4j
public class TaskService {
public String callableTask() throws InterruptedException{
Thread.sleep(5000);
log.info("+++&