下面是对“Spring-MVC异步请求之Servlet异步处理”的完整攻略。
一、背景介绍
Spring框架提供了一种使得应用程序支持异步处理请求的方式,能够帮助提高应用程序的性能、吞吐量等指标。其中,支持异步请求的方式包括两种:Callable和DeferredResult,它们都是基于Servlet的异步原语API实现的。本篇攻略将主要介绍Servlet的异步处理方式。
二、Servlet异步处理
Servlet的异步处理方式主要依靠Servlet 3规范中提供的异步原语API实现,API包括了ServletRequest.startAsync()、AsyncContext.start()和AsyncContext.complete()等函数。具体而言,我们可以通过以下三个步骤来实现Servlet的异步处理:
2.1 获取异步上下文
在Servlet的的doGet或doPost方法中,先获取异步上下文:AsyncContext asyncContext = request.startAsync()
;
2.2 开始异步请求
对于异步请求,我们需要另外创建一个线程去处理这个请求,执行完异步计算后,结果将被通过AsyncContext对象进行传递,具体而言,调用AsyncContext的start方法,传入异步方法所在线程,并通过线程返回AsyncContext。例如:
public void doGet(HttpServletRequest request, HttpServletResponse response) {
AsyncContext asyncContext = request.startAsync(request, response);
runAsync(asyncContext);
}
public void runAsync(AsyncContext asyncContext) {
new Thread() {
public void run() {
// 异步处理结果
asyncContext.getResponse().getWriter().println("Hello World!");
asyncContext.complete();
}
}.start();
}
2.3 处理异步结果
将计算结果写入响应对象,调用AsyncContext的complete方法来结束异步请求。
三、Spring-MVC异步请求之Servlet异步处理
由于Servlet的异步处理是基于Servlet的异步原语API实现的,因此Spring-MVC在支持异步处理请求是也使用了Servlet的异步原语API。在支持Spring-MVC异步请求之Servlet异步处理时,我们只需要向下面这样修改代码即可:
@RequestMapping("/async")
@ResponseBody
public DeferredResult<String> async(HttpServletRequest request) {
final DeferredResult<String> result = new DeferredResult<String>();
AsyncContext asyncContext = request.startAsync(request, response);
runnable.runAsync(asyncContext);
asyncContext.addListener(new AsyncListener() {
public void onComplete(AsyncEvent event) throws IOException {
result.setResult("Hello World!");
}
...
});
return result;
}
当这个请求被响应的时候,将会返回一个类似于Future的DeferredResult对象,这个DeferredResult对象在异步计算完成以后,会将计算结果写入响应对象中。
我们也可以通过下面这个例子来更加深入地了解一下如何使用Spring-MVC实现一个异步请求:
@RequestMapping("/async")
@ResponseBody
public DeferredResult<String> async(HttpServletRequest request) {
final DeferredResult<String> result = new DeferredResult<String>();
runnable.runAsync(() -> {
// 异步处理结果
result.setResult("Hello World!");
});
return result;
}
四、总结
本篇攻略主要介绍了Spring-MVC异步请求之Servlet异步处理的相关知识,让我们知道了利用Servlet的异步原语API,我们可以实现非阻塞的异步处理请求,并能更好地提升应用程序的性能、吞吐量等指标。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring-MVC异步请求之Servlet异步处理 - Python技术站