SpringBoot配置动态定时任务

1.配置ScheduledTask

主要是实现SchedulingConfigurer,动态传入cron。

package com.hzl.boot.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * @description @PropertySource:指定加载配置文件位置,@ConfigurationProperties:加载属性的前缀
 * @author: zhiLin
 * @create: 2022-09-24 21:37
 **/
@Data
@Component
@ConfigurationProperties("dynamic")
@PropertySource("classpath:/config/cron.properties")
public class ScheduledTask implements SchedulingConfigurer {

	private String test;

	private Long period = 500L;

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.addTriggerTask(() -> System.out.println("Current time = "+ LocalDateTime.now()), new Trigger() {
			@Override
			public Date nextExecutionTime(TriggerContext triggerContext) {
				// 1. 使用 cronTrigger触发器动态修改定时执行时间
				CronTrigger cronTrigger = new CronTrigger(test);
				Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);

				// 2. PeriodicTrigger设置任意时间段的执行任务(另一种方式)
//				PeriodicTrigger periodicTrigger = new PeriodicTrigger(period);
//				Date nextExecutionTime1 = periodicTrigger.nextExecutionTime(triggerContext);
				return nextExecutionTime;
			}
		});
	}
}

2.配置执行周期

springboot的resources目录下新建/config/cron.properties,并配置如下:

dynamic.test=0/20 * * * * ?

3.编写代码

编写ScheduledController,进行测试用

package com.hzl.boot.controller;

import com.hzl.boot.common.Result;
import com.hzl.boot.config.ScheduledTask;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @description
 * @author: zhiLin
 * @create: 2022-09-24 21:56
 **/
@RestController
@RequestMapping("schedule")
public class ScheduledController {

	@Resource
	private ScheduledTask scheduledTask;

	@GetMapping("/cron")
	public Result dynamicModifiedCron(@RequestParam String cron) {
		System.out.println("new cron time = " + cron);

		scheduledTask.setTest(cron);

		return Result.success();
	}

}

4.浏览器测试

浏览器输入 http://localhost:9090/schedule/cron?cron=0/5 * * * * ?
成功将定时任务从每20秒执行改为每5秒执行
SpringBoot配置动态定时任务_第1张图片

你可能感兴趣的:(springboot,spring,boot,spring)