博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring开启方法异步执行
阅读量:5734 次
发布时间:2019-06-18

本文共 2557 字,大约阅读时间需要 8 分钟。

@EnableAsync

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

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

@Configuration@EnableAsyncpublic class AppConfig {}

 

也可以自定义线程池

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

@Async

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

 

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

@Componentpublic class AsyncTask {   @Async   public void task1() {       try {           Thread.sleep(3000);       } catch (InterruptedException e) {           e.printStackTrace();       }   }   @Async   public Future
task2() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return new AsyncResult
("javastack"); } }

 

测试代码

 

@RunWith(SpringRunner.class)@SpringBootTestpublic class AsyncTest {   private final static Logger log = LoggerFactory.getLogger(AsyncTest.class);   @Autowired   private AsyncTask asyncTask;   @Test   public void testTask1(){       log.info("start");       asyncTask.task1();       log.info("finish");   }   @Test   public void testTask2()  {       log.info("start");       Future
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://qtlwx.baihongyu.com/

你可能感兴趣的文章
js之返回网页顶部
查看>>
Sublime Text3 Python虚拟环境(补充)——解决控制台中文乱码情况
查看>>
权威解读什么是实时BI分析
查看>>
ocrsearch的横屏转竖屏的解决方案
查看>>
Struts 2 - Architecture
查看>>
都有点不敢写东西了
查看>>
获取上月最后一天
查看>>
VIM常用操作命令梳理
查看>>
java中set和get方法的理解
查看>>
java专业规划(转载)
查看>>
Hyper 虚拟机删掉,如何恢复
查看>>
day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)
查看>>
SQL MD5加密
查看>>
《数据库系统概论》第六章笔记
查看>>
基于VMware为CentOS 6.5配置两个网卡
查看>>
css 父元素的宽度随子元素的宽度变化
查看>>
SSM三大框架整合教程
查看>>
【appium】查看Android应用包名、Activity的几个方法
查看>>
monkey测试===Android测试工具Monkey用法简介(转载)
查看>>
java语言之方法的使用与递归算法
查看>>