Spring开启方法异步执行

转载自 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事务注解在同一个方法上同时使用,不然事务注解将无效。

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea关闭页面显示的浏览器图标

每当我们打开HTML或者XML的时候老是弹出来&#xff0c;看着就烦&#xff01; 关闭方法&#xff1a; &#xff08;1&#xff09;点击文件 》设置 &#xff08;2&#xff09;工具 》web浏览器 这样就完成了&#xff0c;再也没有烦人的小图标了。

webpack打包器小结(1)

【1】intro to webpack 官网&#xff1a; webpack官网: http://webpack.github.io/ webpack3文档(英文): https://webpack.js.org/ webpack3文档(中文): https://doc.webpack-china.org/ 【2】 自动化构建工具webpack_打包js,json文件 step1、创建文件夹 mywebpack ; st…

Spring快速开启计划任务

转载自 Spring快速开启计划任务 Spring3.1开始让计划任务变得非常简单&#xff0c;只需要几个注解就能快速开启计划任务的支持。 EnableScheduling Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Import(SchedulingConfiguration.class) Documented public i…

ACM训练4

AB Problem INPUT Each line will contain two integers A and B. Process to end of file. OUTPUT For each case, output A B in one line. 问题连接&#xff1a;https://vjudge.net/problem/hdu-1000?tdsourcetags_pctim_aiomsg AC代码如下&#xff1a; #include &…

Spring Aware容器感知技术

转载自 Spring Aware容器感知技术 Spring Aware是什么 Spring提供Aware接口能让Bean感知Spring容器的存在&#xff0c;即让Bean可以使用Spring容器所提供的资源。 Spring Aware的分类 几种常用的Aware接口如下。 Aware接口说明ApplicationContextAware能获取Application Co…

json详解

JSON的全称是”JavaScript Object Notation”&#xff0c;意思是JavaScript对象表示法&#xff0c;它是一种基于文本&#xff0c;独立于语言的轻量级数据交换格式。XML也是一种数据交换格式&#xff0c;为什么没有选择XML呢&#xff1f;因为XML虽然可以作为跨平台的数据交换格式…

Error in nextTick: “TypeError: Cannot read properties of undefined (reading ‘clearValidate‘)“

我在打开对话框清除表单校验的时候报了这个错 我的解决办法是加个if判断有没有 这是原来的 加个if

ACM训练题6

ASCII码排序 Problem Description INPUT 输入三个字符后&#xff0c;按各字符的ASCII码从小到大的顺序输出这三个字符。 OUTPUT 对于每组输入数据&#xff0c;输出一行&#xff0c;字符中间用一个空格分开. 问题连接&#xff1a;https://vjudge.net/problem/hdu-2000 AC…

Spring Enable*高级应用及原理

转载自 Spring Enable*高级应用及原理 Enable* 之前的文章用到了一些Enable*开头的注解&#xff0c;比如EnableAsync、EnableScheduling、EnableAspectJAutoProxy、EnableCaching等&#xff0c;Enable表示开启/允许一项功能。 Enable*工作原理 我们只需要几个很简单的注解就…

ACM训练题7

计算球体积 Problem Description 根据输入半径输出球的体积 INPUT 输入数据有多组&#xff0c;每组占一行&#xff0c;每行包括一个实数&#xff0c;表示球的半径。 OUTPUT 输出对应的球的体积&#xff0c;对于每组输入数据&#xff0c;输出一行&#xff0c;计算结果保留…

JSON与JS对象的区别

和一些同学一样&#xff1a;总是感觉json对象(其实json不是对象)和js对象的字面量表示法相同&#xff0c;最近学习json&#xff0c;真心搞不懂&#xff0c;js对象和json有什么区别&#xff1f;就是感觉json的key要用” “括起来&#xff0c;但是js对象的字面量表示法不需要。  …

Spring Boot开启的2种方式

转载自 Spring Boot开启的2种方式Spring Boot依赖 使用Spring Boot很简单&#xff0c;先添加基础依赖包&#xff0c;有以下两种方式 1. 继承spring-boot-starter-parent项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…

JSON | JSON字符串和JSON对象的区别

最近在学习Vue.js&#xff0c;里面有个存储、读取本地缓存的功能&#xff0c;不停地用JSON.parse()&#xff0c;和JSON.stringify()来转换JSON字符串和JSON对象。自己有点晕&#xff0c;不明白两者的区别&#xff0c;看起来感觉是一样的&#xff0c;也不知道为什么一定要转换才…

Spring Boot Starters启动器

转载自 Spring Boot Starters启动器 Starters是什么&#xff1f; Starters可以理解为启动器&#xff0c;它包含了一系列可以集成到应用里面的依赖包&#xff0c;你可以一站式集成Spring及其他技术&#xff0c;而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库&…

数列有序

Promble Description 有n(n<100)个整数&#xff0c;已经按照从小到大顺序排列好&#xff0c;现在另外给一个整数x&#xff0c;请将该数插入到序列中&#xff0c;并使新的序列仍然有序。 INPUT 输入数据包含多个测试实例&#xff0c;每组数据由两行组成&#xff0c;第一行…

Spring Boot自动配置原理、实战

转载自 Spring Boot自动配置原理、实战 Spring Boot自动配置原理 Spring Boot的自动配置注解是EnableAutoConfiguration&#xff0c;从上面的Import的类可以找到下面自动加载自动配置的映射。 org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Cla…

ES6 Map对象的使用

转自&#xff1a; https://blog.csdn.net/u012664198/article/details/97373751 Map对象保存键值对,任何值(对象或者原始值) 都可以作为一个键或一个值 key和value可以是字符串等数据类型&#xff0c;也可以是对象&#xff0c;函数&#xff0c;NaN。 set&#xff1a;insert ke…

水仙花数

Problem Description 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如&#xff1a;1531^35^33^3。 现…

JDBC元数据操作(一)-- DatabaseMetaData接口详解

转自&#xff1a; https://blog.csdn.net/chen_zw/article/details/18816599 1. 前言 在JDBC技术规范中&#xff0c;提供了Connection&#xff0c;Statement,ResultSet这三个开发过程中经常用到的接口。针对与每个接口&#xff0c;JDBC规范提供了相应的接口描述对象&#…

Spring Boot核心配置

转载自 Spring Boot核心配置 启动类 在包根目录下添加启动类&#xff0c;必须包含main方法&#xff0c;再添加Spring Boot启动方法&#xff1a; SpringApplication.run(SampleController.class, args); 或者流式API new SpringApplicationBuilder().run(args); 下面是一个典型的…