async异步请求,@async异步方法

http://www.itjxue.com  2023-01-07 18:27  来源:未知  点击次数: 

java web异步请求中,async什么意思

async 是 asynchronous 就是异步标签。spring3之后支持@Async注解的异步任务,和java web无关。java web中servlet3.0标准支持异步http请求处理。现在常用的web mvc框架中个Spring MVC 3.2 M1 引入支持servlet3.0。

以下是来自 Spring 官方博客的消息:

Spring MVC 3.2 M1 将引入对异步请求处理的支持,基于 Servlet 3.0 规范。尽管该版本还没发布,你可以在这里看到包含的改进。

简单预览一下:

一个控制器方法可通过返回 Callable 来完成异步处理:

@RequestMapping(method=RequestMethod.POST)

public CallableString processUpload(final MultipartFile file) {

return new CallableString() {

public Object call() throws Exception {

// ...

return "someView";

}

};

}

或者控制器方法返回 DeferredResult (new in Spring 3.2 M1) 来完成处理

@RequestMapping("/quotes")

@ResponseBody

public DeferredResult quotes() {

DeferredResult deferredResult = new DeferredResult();

// Add deferredResult to a Queue or a Map...

return deferredResult;

}

// In some other thread..

// Set the return value on the deferredResult

deferredResult.set(data);

异步调用@Async

1、在spring boot的启动类上标注 @EnableAsync (扫描到就行)

2、在需要异步执行的方法上标注 @Async

简单两步完成异步调用

一、异步方法也可以有返回值:

二、 静态方法上的 @Async 会失效

三、 异步方法上标注的 @Transactional 也会失效

四、 异步执行中的异常在 ExceptionHandler 、 HandlerExceptionResolver 中是无法处理的,我们可以通过下面的方式统一处理异步执行中的异常

五、我们可以为异步执行配置自定义的 Executor :

SpringBoot @Async实现异步调用

异步调用是相对于同步调用的,同步调用是按照顺序进行执行任务,只有上一个任务执行完成下一个任务才能执行, 异步调用是指在按照顺序执行任务的过程中不需要等待任务结果的出现,就可以顺序执行下一个任务 。

异步处理的方式:

SpringBoot自身没有对异步调用做很大的变动,基本还是使用SpringMVC的@Async

注解 :在使用**@EnableWebMvc**注解的时候也可以开启异步调用,但是在SpringBoot中使用异步调用会使得SpringBoot的AutoConfig一部分功能失效。

定义一个或者多个线程池

我们使用 ThreadPoolTaskExecutor 创建线程池,其参数配置如下:

异步调用方法有两种一个是没有返回值的,一种是有返回值的,具体实现如下:

在多线程池的时候,我们需要在@Async()指定线程池名称**@Async("threadPoolTaskExecutor1")**

在单元测试用例中,注入Task对象,并在测试用例中执行 asyncMethodWithVoidReturnType_One 、 asyncMethodWithVoidReturnType_Two() 、 asyncMethodWithVoidReturnType_Three() 三个函数。

执行结果如下:

async/await 来处理异步/同步

前面比较啰嗦,希望读者耐心看完。

async/await可以说是一个老生常谈,但是每一个前端工程师却又避不开的话题。

在JQuery一把梭的时代,如果遇到下面类似的需求,你要怎么做?

需求:拿到第一个ajax请求省,拿到省数据请求第二个ajax来获得市的数据,拿到市的数据再请求第三个ajax来获得区的数据。

最常见的写法莫过于两种:

1、回调地狱式写法:

简直令人发疯。

或者是这样?同步请求

我靠,只要一个数据请求不回来页面就完犊子了。这简直是噩梦。

别笑,我相信身为前端工程师一定这么写过。

直到有一天,你发现vue里没有Jquery,只有基于promise写的axios.

一开始在使用axios的时候,还是脱离不了必须同步请求的变成思想,于是在vue项目中引入了jquery,把项目搞成了四不像。

研究了好久,终于发现了async/await

async 词面翻译 “异步”。 async关键字一般放到function的前面,用来表示一个异步函数。如下

根据阮一峰es6教程关于async部分的介绍,能得知async会返回一个Promise对象。所以我们可以通过then来调用。

如果不太明白,那我这么写你一定会明白:

词面意思“等待”,它只会在async函数体内出现,代表执行到这里的时候,等一下。它后面可以跟任何表达式,不过一般会跟一个Promise,可以实现异步函数同步调用的效果。

delay是异步函数,在正常情况下,如果这样写:

会先输出2,然后1秒后再输出1.

但是在await的影响下,函数会先等待5秒后输出a,在等待4秒后输出b。

话题再转回到我们一开始说的ajax,使用async/await的方法来写,是不是感觉优雅多了?

在vue中,我们会使用axios来与后台做数据交互,axios没有同步请求,只有异步请求,所以我们可以使用async/await来模拟一个同步请求,实现功能。

(责任编辑:IT教学网)

更多

推荐管理维护文章