@async 没有异步_spring boot使用@Async异步任务

b6181d66550afdaf026dd46954a0125e.png

欢迎关注微信公众号:xiaosen_javashare

github项目地址:https://github.com/lgsdaredevil/asyncTest

开启异步任务

在应用主类中添加@EnableAsync注解

3ea784d6d42f013945f482a7c63438fa.png

写异步任务方法

@Async

public Future ansync(String name){

try {

Thread.sleep(10000);

logger.info("这里是异步方法");

logger.info("传过来的名字是:" + name);

name = "修改的名字";

logger.info("修改后的名字是:" + name);

return new AsyncResult<>("name: " + name);

}catch (Exception e){

return new AsyncResult<>("异常");

}

}

调用异步方法

  • 1、用Future获取返回值

public String requestAnsync(String name){

try {

Long start = System.currentTimeMillis();

Future result = ansync(name);

if (result.isDone()){

name = result.get();

logger.info("异步方法结束,名字改为:" + name);

}

Long end = System.currentTimeMillis();

logger.info("耗时:" + (int)(end-start));

return "hello " + name;

}catch (Exception e){

logger.error("异常");

return "异常";

}

}

返回值,若想获取到返回值,应该轮询方法获取,否则若果没有isDone则不会走下面的方法,或者可以使用CompletableFuture:

2018-07-17 11:31:55.390 INFO 5232 --- [nio-8080-exec-6] c.e.async.service.AsyncTestService : 耗时:0

2018-07-17 11:32:05.394 INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest : 这里是异步方法

2018-07-17 11:32:05.394 INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest : 传过来的名字是:ling

2018-07-17 11:32:05.394 INFO 5232 --- [cTaskExecutor-3] com.example.async.service.AsyncTest : 修改后的名字是:修改的名字

如果使用future.get()方法会阻塞线程直到拿到结果。

  • 2、不使用future.get()方法,异步方法不使用Future返回

@Async

public void noReturnAsync(String name){

try {

Thread.sleep(10000);

logger.info("这里是异步方法");

logger.info("传过来的名字是:" + name);

name = "修改的名字";

logger.info("修改后的名字是:" + name);

}catch (Exception e){

}

}

调用异步的方法

public String noReturn(String name){

Long start = System.currentTimeMillis();

asyncTest.noReturnAsync(name);

Long end = System.currentTimeMillis();

logger.info("耗时:" + (int)(end-start));

return "hello " + name;

}

注意的地方:

如果异步方法变成阻塞的同步方法,可能原因是异步方法和普通的调用方法在同一个类中,解决方法是将异步方法单独放到一个类中。

产生原因:spring对@Transactional注解时也有类似问题,spring扫描时具有@Transactional注解方法的类时,是生成一个代理类,由代理类去开启关闭事务,而在同一个类中,方法调用是在类体内执行的,spring无法截获这个方法调用。

具体参见:Spring Boot使用@Async实现异步调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值