业务:
通过spring注解@EnableAsync,@Async,实现同一时间点,定时触发多个业务,并分发给多个线程执行
1、新建线程池类,注意要加@EnableAsync注解
@Configuration
@EnableAsync
public class SuperviseOrderThreadPool {
@Bean(name = "superviseOrderPool")
public Executor triggerPoolExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(16);
//配置最大线程数
executor.setMaxPoolSize(16);
//配置队列大小
executor.setQueueCapacity(100);
//配置线程池中的线程的名称前缀
executor.setThreadNamePrefix("superviseOrderPool-");
//执行初始化
executor.initialize();
return executor;
}
}
2、把业务逻辑不相关的方法拆分,并写在一个新类里SuperviseOrderTask ,类上加@Component才能作为Bean交给Spring管理;
每个方法用@Async(“superviseOrderPool”)指定线程池;
注意:如果你在SuperviseOrderTask 本类中直接调用方法,是不会触发@Async多线程执行的效果的,因为当你在同一个类中直接调用这个方法时,实际调用的是本类的原始方法,而spring需要通过代理类来完成此功能,所以要通过别的类导入才可以给到spring代理的机会;
@Component
public class SuperviseOrderTask {
//在本类中直接调用,触发不了@Async异步执行功能,spring需要通过代理类来触发,所以要通过别的类导入才可以,所以新增SuperviseOrderSumUpTask
//@Scheduled(cron = "${task.cron.insertSuperviseOrderKpiCron}")
//public void insertSuperviseOrder() {
// insertSuperviseOrderInstallCswsl();
// insertSuperviseOrderInstallCswsx();
// insertSuperviseOrderInstallCswyy();
// }
//3个业务逻辑不相关,互不影响的3个方法,但是他们都需要在同一时间触发
// 1)超时未受理
@Async("superviseOrderPool")
public void insertSuperviseOrderInstallCswsl() {
//业务代码内容省略
logger.info("insertSuperviseOrderInstallCswsl 定时任务开始");
}
// 2) 超时未首响
@Async("superviseOrderPool")
public void insertSuperviseOrderInstallCswsx() {
//业务代码内容省略
logger.info("insertSuperviseOrderInstallCswsx 定时任务开始");
}
// 3) 超时未预约
@Async("superviseOrderPool")
public void insertSuperviseOrderInstallCswyy() {
//业务代码内容省略
logger.info("insertSuperviseOrderInstallCswyy 定时任务开始");
}
}
3、新建一个类SuperviseOrderSumUpTask 专门来调用这几个方法;
把SuperviseOrderTask用@Autowired导入进来,给spring发挥自己的代理功能的机会,进而才能实现@Async注解的异步功能。
@Component
@EnableScheduling
public class SuperviseOrderSumUpTask {
@Autowired
private SuperviseOrderTask superviseOrderTask;
//多个业务方法汇聚在一起触发,用多线程调用
@Scheduled(cron = "${task.cron.insertSuperviseOrderKpiCron}")
public void insertSuperviseOrder() {
superviseOrderTask.insertSuperviseOrderInstallCswsl();
superviseOrderTask.insertSuperviseOrderInstallCswsx();
superviseOrderTask.insertSuperviseOrderInstallCswyy();
}
}