转载自 Spring开启方法异步执行

@EnableAsync

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {Class<? extends Annotation> annotation() default Annotation.class;boolean proxyTargetClass() default false;AdviceMode mode() default AdviceMode.PROXY;int order() default Ordered.LOWEST_PRECEDENCE;}

@EnableAsync注解即开启Spring对方法异步执行的能力,需要和注解@Configuration配合使用。

@Configuration
@EnableAsync
public class AppConfig {}

也可以自定义线程池

@Configuration@EnableAsyncpublic class AppConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(7);executor.setMaxPoolSize(42);executor.setQueueCapacity(11);executor.setThreadNamePrefix("MyExecutor-");executor.initialize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return MyAsyncUncaughtExceptionHandler();}}

@Async

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {String value() default "";}

在要异步执行的方法上使用@Async注解,下面是一个没有返回值,一个带有返回值的异步调用的示例。

@Component
public class AsyncTask {@Asyncpublic void task1() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}@Asyncpublic Future<String> task2() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}return new AsyncResult<String>("javastack");  }}

测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncTest {private final static Logger log = LoggerFactory.getLogger(AsyncTest.class);@Autowiredprivate AsyncTask asyncTask;@Testpublic void testTask1(){log.info("start");asyncTask.task1();log.info("finish");}@Testpublic void testTask2()  {log.info("start");Future<String> future = asyncTask.task2();while (true) {if (future.isDone()) {try {log.info("result is " + future.get());} catch (Exception e) {e.printStackTrace();} break;}}log.info("finish");}}

注意事项

1、使用注意

@Async只能使用到被代理的对象方法上,即代理类的入口方法处,且方法必须是public的。

2、事务处理机制

使用@Async异步注解不能和@Transaction事务注解在同一个方法上同时使用,不然事务注解将无效。

要使用事务,需要把事务注解提取到方法里面的子方法上。

Spring开启方法异步执行相关推荐

  1. Spring Boot 之异步执行方法

    给方法加上 @Async 注解 package me.deweixu.aysncdemo.service; public interface AsyncService {void asyncMetho ...

  2. Spring 接口方法异步调用

    对外开放的接口,在被外部调用时,需要校验接收到的数据,校验通过后才能开始进行数据处理,处理完成后向特定地址返回结果. 校验通过后即返回接口调用的响应信息,就涉及到方法的异步调用.在 Spring 框架 ...

  3. VUE的creat方法异步执行

    遇见的问题是发现有个方法时灵时不灵 created() { //Vue的creat方法是异步的this.getUser();this.getApplyInfo(); },methods: {getUs ...

  4. Spring Boot如何实现异步执行任务

    所谓异步任务,其实就是异步执行程序,有些时候遇到一些耗时的的任务,如果一直卡等待,肯定会影响其他程序的执行,所以就让这些程序需要以异步的方式去执行.那么下面就来介绍Spring Boot 如何实现异步 ...

  5. 【SpringBoot】“@Async” 实现异步执行任务

    目录 一.开启异步调用方法 二.创建异步执行类 三.调用异步方法 一.开启异步调用方法 在application启动类中,加上@EnableAsync注解,Spring Boot 会自动扫描异步任务. ...

  6. Spring中的异步和事务性事件侦听器

    内置的事件发布功能从Spring的早期版本开始存在,对于处理同一应用程序上下文中Spring组件之间的基本通信仍然有用. 通常,应用程序可以生成应用程序事件(可以是任意对象)并侦听它们. 整个机制非常 ...

  7. 【Python】称重系统-异步执行多线程运行threading 模块 Thread 类实现

    上次实现了从一个py程序窗口引用另一个py程序,但是发现原来的py窗口关不掉,最后学到一个新的方法-异步执行,Python的多线程编程,使用了threading 模块,可以同时运行两段代码.完美解决之 ...

  8. spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql...

    spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql 转载于:https://www.cnblogs.com/classmethond/p/104 ...

  9. 【spring】spring异步执行的使用与源码分析

    在实际的开发过程中,有些业务逻辑使用异步的方式处理更为合理.比如在某个业务逻辑中,需要把一些数据存入到redis缓存中,这个操作只是一个辅助的功能,成功或者失败对主业务并不会产生根本影响,这个过程可以 ...

最新文章

  1. Python模块EasyGui专题学习
  2. 【运营】产品经理必须了解的运营方法,让你的产品有产有销
  3. window 下生成SSH key
  4. pringMVC“Ambiguous mapping found. Cannot map 'XXXController' bean method”解决方法
  5. java生成world文件_HelloWorld.java文件如何创建?
  6. 实现Runnable 创建多线程的简单实现
  7. 解析一个C语言俄罗斯方块游戏,包你看了就会
  8. 后盾网php多少钱_商标转让做公证花多少钱-购店网
  9. mybatis parametertype 多个参数
  10. 一些OEM的厂商的漏洞分析
  11. SPOJ DQUERY D-query(主席树 区间不同数个数)
  12. python/数据库操作补充—模板—Session
  13. msfconsole理论
  14. 252个核心词根——词缀(前缀-后缀)总结大全【最全-一文看懂!!!】
  15. PPT图形绘制:端午节PPT模板背景
  16. Excel提示:您的组织策略阻止我们为您完成此操作
  17. php 的绝对引用,excel单元格引用分为哪三种
  18. PIE-engine 教程 ——提取黄河流域/山西省1980—2018年流域降水量并对比分析
  19. 集成学习中boosting、bagging、随机森林算法的介绍
  20. 发邮件如何隐藏IP地址

热门文章

  1. 二分+01分数规划+最大化平均值 Dropping tests POJ - 2976
  2. 哈工大威海计算机组成原理,哈工大威海计算机组成原理复习.pdf
  3. 数据结构与算法--举例分析法- 栈的压入弹出序列
  4. word List 30
  5. autowired用在static_java – @Autowired和static方法
  6. 经典排序算法(4)——折半插入排序算法详解
  7. P4288 [SHOI2014]信号增幅仪 最小圆覆盖
  8. 【CF487E】Tourists【圆方树】【树链剖分】【multiset】
  9. NC16886 炮兵阵地
  10. 【COCI 2018/2019 Round #2】Kocka