spring注解实现多线程

业务:
通过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();

    }


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值