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表达式变动了,仍需重启项目才能奏效,不符合变动即动态更新定时任务的要求

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值