Springboot实现动态设置定时任务

一、背景介绍

在实际设计开发“测试集”功能的时候,为每一个测试集提供了一个定时任务cron表达式字段,代码需要实现将具备cron表达式的测试集动态加入到定时任务中,按cron表达式的规则定时执行测试集中的接口用例

二、Springboot实现流程

2.1 创建ScheduledConfig配置类

package com.test.testmanagement.config;

import com.test.testmanagement.controller.casemanagementcontroller.InterfaceCaseTestSuiteController;
import com.test.testmanagement.model.interfaceBean.InterfaceCaseTestSuite;
import com.test.testmanagement.service.InterfaceCaseTestSuiteService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;

import java.util.List;

/**
 * @description:
 * @author: XXX
 * @time: 2021-02-09 15:42
 */
@Configuration
public class ScheduledConfig implements SchedulingConfigurer {

    @Autowired
    private TaskScheduler myThreadPoolTaskScheduler;

    @Autowired
    private InterfaceCaseTestSuiteService interfaceCaseTestSuiteService;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(myThreadPoolTaskScheduler);

        try{
            //获取所有的设置定时任务的测试集
            List<InterfaceCaseTestSuite> interfaceCaseTestSuiteList = interfaceCaseTestSuiteService.findAllInterfaceCaseTestSuiteWithCrontab();
            System.out.println("需要执行定时任务的测试集个数为:" + interfaceCaseTestSuiteList.size());
            InterfaceCaseTestSuiteController interfaceCaseTestSuiteController = new InterfaceCaseTestSuiteController();
            for(InterfaceCaseTestSuite testSuite : interfaceCaseTestSuiteList){
                //可以实现动态调整定时任务的执行频率
                taskRegistrar.addTriggerTask(
                        // 1、添加任务内容(Runnable)
//                        () -> System.out.println("cccccccccccccccc--->" + Thread.currentThread().getId()),
                        new Runnable() {
                            @Override
                            public void run() {
                                try{
                                    interfaceCaseTestSuiteController.debugInterfaceCaseTestSuite(testSuite.getId(), testSuite.getTestSuiteName());
                                }catch (Exception e){
                                    e.printStackTrace();
                                }
                            }
                        },
                        // 2、设置执行周期(Trigger)
                        triggerContext -> {
                            //2.1 从数据库动态获取执行周期
                            String cron = testSuite.getTestSuiteCronExpression();
                            //2.2 合法性校验.
                            if (StringUtils.isEmpty(cron)) {
                                // Omitted Code ..
                                System.out.println("计划任务为空");
                            }
                            //2.3 返回执行周期(Date)
                            return new CronTrigger(cron).nextExecutionTime(triggerContext);
                        }
                );
            }
        }catch (Exception e){
            System.out.println("动态定时任务出现异常!!");
            e.printStackTrace();
        }
    }
}

2.2 重启项目,定时任务就会自动添加

存在问题:
当某个测试集的cron表达式变动了,仍需重启项目才能奏效,不符合变动即动态更新定时任务的要求

猜你喜欢

转载自blog.csdn.net/sinat_34241861/article/details/113842306