一、背景介绍
在实际设计开发“测试集”功能的时候,为每一个测试集提供了一个定时任务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表达式变动了,仍需重启项目才能奏效,不符合变动即动态更新定时任务的要求