针对“SpringMVC异步处理的 5 种方式示例详解”的完整攻略,我将从以下几个方面进行详细讲解:
- 什么是SpringMVC异步处理
- SpringMVC异步处理的5种方式
- 异步处理方式的示例说明
- 总结
1. 什么是SpringMVC异步处理
在SpringMVC中,一般的请求处理是同步的,也就是说请求到达后一直会占用线程,等待响应并返回结果。但是面对一些复杂的请求时,这种同步的方式就显得捉襟见肘了,比如长时间的文件上传和下载、查询复杂耗时的SQL、查询Web Service等。因此,SpringMVC为了更好的解决适合异步处理的请求,提出了异步处理的机制,使得这些请求需要等待的时间大大缩短。
2. SpringMVC异步处理的5种方式
SpringMVC异步处理主要有以下5种方式:
- 使用DeferredResult
- 使用Callable
- 使用ListenableFuture
- 使用CompletableFuture
- 使用Servlet 3.0
接下来我将分别对这5种方式进行详细讲解。
2.1 使用DeferredResult
使用DeferredResult是SpringMVC提供的一种异步非阻塞返回结果的方式,通过使用它,控制器线程可以先响应并返回空的DeferredResult对象,这个DeferredResult的结果在另外一个线程中计算并设置,当计算完成后,DeferredResult会携带计算出来的结果响应客户端。
2.2 使用Callable
Callable是Java并发包提供的类,能够异步执行一个任务并返回结果,类似于Runnable,但有返回值。在SpringMVC中使用Callable的原理与DeferredResult类似,当控制器线程遇到Callable时,会先执行并返回一个Callable对象,然后再启动一个新的线程来执行Callable,返回结果后,该线程又会转回控制器线程来响应客户端请求。
2.3 使用ListenableFuture
ListenableFuture基于Guava库,与DeferredResult类似,它也能够异步处理,只是操作更加灵活。通过ListenableFuture,可以在异步执行结束后立即执行一些操作,而不用像DeferredResult一样通过回调函数来操作。
2.4 使用CompletableFuture
CompletableFuture也是Java的一个异步处理类,在Java8中引入了这个类。它相比DeferredResult和ListenableFuture更加强大,并且也支持异步触发回调函数。
2.5 使用Servlet 3.0
Servlet 3.0提供的异步处理方式相对于前面的4种方式,更加简单直接。在Servlet 3.0中,只需要给异步处理的请求设置一个AsyncContext异步上下文,便能够异步返回结果。
3. 异步处理方式的示例说明
现在,让我们通过两个示例,分别来说明两种异步处理方式:使用DeferredResult和使用CompletableFuture。
3.1 使用DeferredResult
以使用DeferredResult处理下载文件请求为例,如下:
@GetMapping("/download")
@ResponseBody
public DeferredResult<byte[]> download(final int delay) {
final DeferredResult<byte[]> deferredResult = new DeferredResult<>(60000L);//设置60s的超时返回结果
// 新起一个线程异步执行文件下载
new Thread(() -> {
try {
byte[] fileByte = fileService.download(delay);
//计算文件hash值
String fileMd5 = DigestUtils.md5Hex(fileByte);
//设置DeferredResult结果
deferredResult.setResult(fileByte);
} catch (Throwable t) {
deferredResult.setErrorResult(t);
}
}).start();
return deferredResult;
}
这个例子中,当用户请求下载文件时,由于文件下载的时间比较长,为了避免这个请求一直占用线程,我们就需要使用DeferredResult。实现的原理和我们前面的介绍中一样,先响应一个空DeferredResult对象,等待后续计算,计算完毕后再回调设置DeferredResult的结果。
当我们使用浏览器访问该地址时,由于异步执行文件下载,因此页面不会直接以文件形式下载,而是等待60秒,然后将下载的文件返回。
3.2 使用CompletableFuture
接下来,我们再介绍一下如何使用CompletableFuture异步处理请求。以查询Web Service为例:
@GetMapping("/webService")
@ResponseBody
public CompletableFuture<Result> callWebService() {
return CompletableFuture.supplyAsync(() -> {
Result result = webService.callWebService(); //调用WebService接口
return result;
});
}
如果Web service调用返回的结果比较缓慢,当前线程会一直阻塞,无法响应其他请求,因此我们需要使用CompletableFuture,并使用它提供的异步回调,通过新起一个线程异步调用Web service接口。
4. 总结
SpringMVC提供的异步处理机制,能够让SpringMVC更加高效地处理一些长时间等待的请求,提高系统的响应速度和效率。SpringMVC提供了5种异步处理的方式,包括使用DeferredResult、Callable、ListenableFuture、CompletableFuture和Servlet 3.0,不同的异步处理方式有不同的特点和使用场景,我们可以根据需要自行选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC异步处理的 5 种方式示例详解 - Python技术站