Spring里的Async注解实现异步操作的方法步骤
异步执行一般用来发送一些消息数据,数据一致性不要求太高的场景,对于spring来说,它把这个异步进行了封装,使用一个注解就可以实现。
何为异步调用?
在解释异步调用之前,我们先来看同步调用的定义;同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。 异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 a, b, c三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如b为一个异步的调用方法,则在执行完a之后,调用b,并不等待b完成,而是执行开始调用c,待c执行完毕之后,就意味着这个过程执行完毕了。
@async介绍
在spring中,基于@async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。
分为不带参数的异步调用;带参数的异步调用;调用返回future的异步线程
@async调用中的事务处理机制
在@async标注的方法,同时也适用了@transactional进行了标注;在其调用数据库操作之时,将无法产生事务管理的控制,原因就在于其是基于异步处理的操作。 那该如何给这些操作添加事务管理呢?可以将需要事务管理操作的方法放置到异步方法内部,在内部被调用的方法上添加@transactional. 例如: 方法a,使用了@async/@transactional来标注,但是无法产生事务控制的目的。 方法b,使用了@async来标注, b中调用了c、d,c/d分别使用@transactional做了标注,则可实现事务控制的目的。
用法
1.程序启动时开启@enableasync注解
2.建立新的类型,建立异步方法,为方法添加@async注解
3.在业务代码中,@autowired注入你的类型,使用它即可
我们可以关注到在配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用.
async几种方式
1.没有返回值的,不会阻塞主线程,相当于开启新线程在后台执行这个任务
@async public string sayhello2() throws interruptedexception { thread.sleep(2 * 1000);//网络连接中 。。。消息发送中。。。 return "我爱你啊!";// 调用方调用后会立即返回,所以返回null }
1.带有返回值的,返回类型必须为future<>,它会开启新的线程执行任务,并阻塞主线程,执行完成后把结果返回给主线程
@async public future<string> asyncfunc() throws interruptedexception { int thinking = 2; thread.sleep(thinking * 1000); system.out.println("async!"); return new asyncresult<string>("发送消息用了" + thinking + "秒"); }
调用方法
@getmapping("/lind-demo/asyncfunc") public void async() throws exception { future<string> future = null; future = asyncservice.asyncfunc(); system.out.println(future.get()); system.out.println("主线程被阻塞执行完成"); }
执行结果
async!
发送消息用了2秒
主线程执行完成
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。