根据前端传进来的时间动态执行定时任务

SpringBoot 创建定时任务(配合数据库动态执行)

话不说多先上依赖

		<dependency>
			<groupId>org.mybatis.spring.bootgroupId>
			<artifactId>mybatis-spring-boot-starterartifactId>
			<version>1.3.1version>
		dependency>
		<dependency>
			<groupId>mysqlgroupId>
			<artifactId>mysql-connector-javaartifactId>
			<scope>runtimescope>
		dependency>

创建定时任务基本就两种,
一种注解@Scheduled.直接根据cron表达式去设置时间就可以了.
一种基于接口SchedulingConfigurer实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就大派用场了

cron表达式

Cron表达式参数分别表示:
秒(0~59) 例如0/5表示每5秒
分(0~59)
时(0~23)
月的某天(0~31) 需计算
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)

首先创建数据库

根据前端传进来的时间动态执行定时任务_第1张图片

接着配置application.properties

根据前端传进来的时间动态执行定时任务_第2张图片

创建定时器任务

@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {

    @Autowired
    @SuppressWarnings("all")
    CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        TestController testController = new TestController();
        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () ->
                        testController.method(),
        //2.设置执行周期(Trigger)
        (TriggerContext triggerContext) -> {
            //2.1 从数据库获取执行周期
            String cron = cronMapper.getCron();
            //2.2 合法性校验.
            if (StringUtils.isEmpty(cron)) {
                // Omitted Code ..
            }
            //2.3 返回执行周期(Date)
            return new CronTrigger(cron).nextExecutionTime(triggerContext);
        }
        );
    }

}

controoler层

@RestController
@RequestMapping
public class TestController {
    @Autowired
    TestService testService;

    /**
     * 方法体
     */
    public void method() {
        System.out.println("执行定时任务: " + LocalDateTime.now().toLocalTime());
    }

    @RequestMapping(value = "/time")
    public String updateCron(@RequestParam(value = "number") String number) {
        String cron=null;
        try {
            cron="0/"+number+" * * * * ?";
            testService.updateCron(cron);
            return "修改成功";
        } catch (Exception e) {
            e.printStackTrace();
            return "修改失败";
        }

    }
}

service层mapper层很简单,一个修改,一个读取完事

根据前端传进来的时间动态执行定时任务_第3张图片

总结:我这里设置的是10秒,只是为了演示用.后期可以根据cron表达式的不同去拼接,从而实现动态设置定时任务.谢谢

你可能感兴趣的:(根据前端传进来的时间动态执行定时任务)