前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring/Spring Boot中使用@Async

Spring/Spring Boot中使用@Async

作者头像
我的小熊不见了丶
发布2019-05-22 21:21:37
1K0
发布2019-05-22 21:21:37
举报
文章被收录于专栏:晓月寒·晓月寒·

当我们在调用某些耗时的方法,比如发起第三方调用时而不关心他的返回值,可以采用@Async来实现异步调用。极大的提升程序的响应速度。

在以往的编程方法中我们一般都是开启另一个线程去处理类似的场景,而在Spring 3.x之后则可以使用@Async。

代码语言:javascript
复制
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
    String value() default "";
}

可以看到@Async可以修饰在方法和类上。当修饰方法时,该方法则成为异步方法,这些方法在执行的时候将会被独立的线程去执行。

在Spring和Spring Boot中启用@Async

在启动类上添加注解:@EnableAsync

在相应的方法上添加注解:@Async

需要处理返回值

如果在使用了@Async的方法时还需要处理它的返回值,那么需要用到Future类。

代码语言:javascript
复制
@Async  
public Future<String> asyncMethodWithReturnType() {  
    System.out.println("Execute method asynchronously - "  
      + Thread.currentThread().getName());  
    try {  
        Thread.sleep(5000);  
        return new AsyncResult<String>("hello world !!!!");  
    } catch (InterruptedException e) {  
        //  
    }  
    return null;  
}

以上是异步方法,调用该方法时应该以如下方式调用:

代码语言:javascript
复制
public void testAsyncAnnotationForMethodsWithReturnType()  
   throws InterruptedException, ExecutionException {  
    System.out.println("Invoking an asynchronous method. "  
      + Thread.currentThread().getName());  
    Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType();  
   
    while (true) {  ///这里使用了循环判断,等待获取结果信息  
        if (future.isDone()) {  //判断是否执行完毕  
            System.out.println("Result from asynchronous process - " + future.get());  
            break;  
        }  
        System.out.println("Continue doing something else. ");  
        Thread.sleep(1000);  
    }  
}

通过while true来循环判断异步方法是否正常返回,但是这样的代码在正常情况下完全没有必要性,不如直接写成同步调用。

异常处理

在异步方法中,如果出现了异常,对于调用者而言是无法感知的。如果确实需要处理异常,则需要自定义实现AsyncTaskExecutor。

事务ransactional。

例如:方法A,使用了@Async/@Transactional来修饰,但是无法达到事务控制的目的。

方法B,使用了@Async修饰,B中调用了C、D,C/D分别使用@Transactional来修饰,可以达到事务控制的目的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Spring和Spring Boot中启用@Async
  • 需要处理返回值
  • 异常处理
  • 事务ransactional。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档