我的项目目前主要使用这个注解做一些与主流程无关的任务,如注册成功完发送短信,当调用第三方接口出错时发送钉钉消息登等,项目为springboot项目
- 首先你要配置一个 ThreadPoolTaskExecutor,一个项目中可以有多个ThreadPoolTaskExecutor
@Bean("asyncTaskExecutor") public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心线程数 executor.setCorePoolSize(3); // 最大线程数 executor.setMaxPoolSize(20); // 队列的深度 executor.setQueueCapacity(256); // 超过改时间线程就被回收 executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("asyncTaskExecutor-"); // 设置拒绝任务策略,使用当前线程执行本次任务 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; }
核心线程数队列会影响吞吐量,线程少的话相当于很少的人在干活,自然干的慢一点,吞吐量就低一点,拒绝策略设置为主线程执行任务,当队列满了(有界队列才有这个说法),线程数又等于maxPoolSize,这个时候会执行相应的拒绝策略,默认是拒绝任务抛出一个异常,这里用了主线程执行,毕竟当前任务是不能丢的.
- 使用注解
@Async 的value 要和 ThreadPoolTaskExecutor bean的名字一样,返回值类型是void,这样就可以异步执行了,快去试试吧
@Async("asyncTaskExecutor") @Override public void sendDingTalkTextMsgExecutor(BooleanDataThreeElementsDTO dto) { DingTalkUtils.sendTextMsgToRobot("出现异常啦"); }