• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Spring开启方法异步执行

技术杂谈 勤劳的小蚂蚁 4个月前 (12-29) 138次浏览 已收录 1个评论 扫描二维码


@EnableAsync

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Import(AsyncConfigurationSelector.class)
  5. public@interfaceEnableAsync{
  6.    Class<?extendsAnnotation> annotation()defaultAnnotation.class;
  7.    boolean proxyTargetClass()defaultfalse;
  8.    AdviceMode mode()defaultAdviceMode.PROXY;
  9.    int order()defaultOrdered.LOWEST_PRECEDENCE;
  10. }
@EnableAsync注解即开启Spring对方法异步执行的能力,需要和注解@Configuration配合使用。
  1. @Configuration
  2. @EnableAsync
  3. publicclassAppConfig{
  4. }
也可以自定义线程池
  1. @Configuration
  2. @EnableAsync
  3. publicclassAppConfigimplementsAsyncConfigurer{
  4.     @Override
  5.     publicExecutor getAsyncExecutor(){
  6.         ThreadPoolTaskExecutor executor =newThreadPoolTaskExecutor();
  7.         executor.setCorePoolSize(7);
  8.         executor.setMaxPoolSize(42);
  9.         executor.setQueueCapacity(11);
  10.         executor.setThreadNamePrefix("MyExecutor-");
  11.         executor.initialize();
  12.         return executor;
  13.     }
  14.     @Override
  15.     publicAsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler(){
  16.         returnMyAsyncUncaughtExceptionHandler();
  17.     }
  18. }

@Async

  1. @Target({ElementType.METHOD,ElementType.TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public@interfaceAsync{
  5.    String value()default"";
  6. }
在要异步执行的方法上使用@Async注解,下面是一个没有返回值,一个带有返回值的异步调用的示例。
  1. @Component
  2. publicclassAsyncTask{
  3.    @Async
  4.    publicvoid task1(){
  5.        try{
  6.            Thread.sleep(3000);
  7.        }catch(InterruptedException e){
  8.            e.printStackTrace();
  9.        }
  10.    }
  11.    @Async
  12.    publicFuture<String> task2(){
  13.        try{
  14.            Thread.sleep(3000);
  15.        }catch(InterruptedException e){
  16.            e.printStackTrace();
  17.        }
  18.        returnnewAsyncResult<String>("javastack");  
  19.    }
  20. }
测试代码
  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. publicclassAsyncTest{
  4.    privatefinalstaticLogger log =LoggerFactory.getLogger(AsyncTest.class);
  5.    @Autowired
  6.    privateAsyncTask asyncTask;
  7.    @Test
  8.    publicvoid testTask1(){
  9.        log.info("start");
  10.        asyncTask.task1();
  11.        log.info("finish");
  12.    }
  13.    @Test
  14.    publicvoid testTask2()  {
  15.        log.info("start");
  16.        Future<String> future = asyncTask.task2();
  17.        while(true){
  18.            if(future.isDone()){
  19.                try{
  20.                    log.info("result is "+ future.get());
  21.                }catch(Exception e){
  22.                    e.printStackTrace();
  23.                }
  24.                break;
  25.            }
  26.        }
  27.        log.info("finish");
  28.    }
  29. }

注意事项

1、使用注意
@Async只能使用到被代理的对象方法上,即代理类的入口方法处,且方法必须是public的。
2、事务处理机制
使用@Async异步注解不能和@Transaction事务注解在同一个方法上同时使用,不然事务注解将无效。
要使用事务,需要把事务注解提取到方法里面的子方法上。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring开启方法异步执行
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. Geekerstar
    111
    Geekerstar2018-12-30 11:34 Mac OS X | Chrome 70.0.3538.110
  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00