??????? spring boot項目實現(xiàn)定時任務,最簡單的一種就是基于注解@Schedule的方式,在啟動類上添加@EnableScheduling注解進行標注,就可實現(xiàn)。但是,這個方式有個缺點,那就是執(zhí)行周期寫死在代碼里,無法動態(tài)改變,想要改變只能修改代碼再重新部署啟動。為了能夠動態(tài)的設置定時任務,為此在網(wǎng)上搜索學習后,特此記錄。
??????? 第一個小demo:
??????? 1、新建一個springboot項目,導入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
????????2、在啟動類上添加@EnableScheduling注解
@EnableScheduling //開啟定時任務
@SpringBootApplication
public class TaskDemoApplication {
public static void main(String[] args) {
SpringApplication.run(TaskDemoApplication.class, args);
System.out.println("(*^▽^*)啟動成功!!!(〃'▽'〃)");
}
}
??????? 3、配置yml,只定義了一個端口號(端口號隨意,沒有被占用就行)
server:
port: 8099
??????? 4、創(chuàng)建定時任務執(zhí)行時間的配置文件:task-config.ini(這一步也可以直接省略,在yml中配置),設置cron表達式
printTime.cron=0/10 * * * * ?
??????? 5、定時任務執(zhí)行類
/**
* 定時任務執(zhí)行類
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {
//方式一:
//----------方式一從這開始----------
@Value("${printTime.cron}")
private String cron;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//動態(tài)使用cron表達式設置循環(huán)間隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
String s = "任務循環(huán)執(zhí)行中。。。。。。";
log.info("Current time: {}", LocalDateTime.now() + "---->" + s);
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//使用CronTrigger觸發(fā)器,可動態(tài)修改cron表達式來操作循環(huán)規(guī)則
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
}
});
}
//----------方式一到這結束----------
}
??????? 6、編寫一個接口,可以通過接口動態(tài)修改定時任務的執(zhí)行時間
@Slf4j
@RestController
@RequestMapping("/")
public class TaskController {
private final ScheduleTask scheduleTask;
@Autowired
public TaskController(ScheduleTask scheduleTask) {
this.scheduleTask = scheduleTask;
}
//方式一
@GetMapping("/updateCron")
public String updateCron(String cron){
log.info("new cron :{}",cron);
scheduleTask.setCron(cron);
return "ok";
}
//方式二
// @GetMapping("/updateTimer")
// public String updateTimer(Long timer){
// log.info("new timer :{}",timer);
// scheduleTask.setTimer(timer);
// return "ok";
// }
}
??????? 7、啟動項目,查看執(zhí)行結果(每10秒執(zhí)行一次)
???????? 8、通過訪問接口,傳入請求參數(shù)cron表達式,設置定時任務時間為每15秒執(zhí)行一次
?????? 查看結果
????????搞定!
?????
cron表達式參考配置:
*/5 * * * * ? 每隔5秒執(zhí)行一次
0 */1 * * * ? 每隔1分鐘執(zhí)行一次
0 0 5-15 * * ? 每天5-15點整點觸發(fā)
0 0/3 * * * ? 每三分鐘觸發(fā)一次
0 0-5 14 * * ? 在每天下午2點到下午2:05期間的每1分鐘觸發(fā)
0 0/5 14 * * ? 在每天下午2點到下午2:55期間的每5分鐘觸發(fā)
0 0/5 14,18 * * ? 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā)
0 0/30 9-17 * * ? 朝九晚五工作時間內(nèi)每半小時
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點
0 0 12 ? * WED 表示每個星期三中午12點
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五點
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發(fā)
0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發(fā)
0 0 23 L * ? 每月最后一天23點執(zhí)行一次
0 15 10 L * ? 每月最后一日的上午10:15觸發(fā)
0 15 10 ? * 6L 每月的最后一個星期五上午10:15觸發(fā)
0 15 10 * * ? 2005 2005年的每天上午10:15觸發(fā)
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
0 15 10 ? * 6#3 每月的第三個星期五上午10:15觸發(fā)
"30 * * * * ?" 每半分鐘觸發(fā)任務
"30 10 * * * ?" 每小時的10分30秒觸發(fā)任務
"30 10 1 * * ?" 每天1點10分30秒觸發(fā)任務
"30 10 1 20 * ?" 每月20號1點10分30秒觸發(fā)任務
"30 10 1 20 10 ? *" 每年10月20號1點10分30秒觸發(fā)任務
"30 10 1 20 10 ? 2011" 2011年10月20號1點10分30秒觸發(fā)任務
"30 10 1 ? 10 * 2011" 2011年10月每天1點10分30秒觸發(fā)任務
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1點10分30秒觸發(fā)任務
"15,30,45 * * * * ?" 每15秒,30秒,45秒時觸發(fā)任務
"15-45 * * * * ?" 15到45秒內(nèi),每秒都觸發(fā)任務
"15/5 * * * * ?" 每分鐘的每15秒開始觸發(fā),每隔5秒觸發(fā)一次
"15-30/5 * * * * ?" 每分鐘的15秒到30秒之間開始觸發(fā),每隔5秒觸發(fā)一次
"0 0/3 * * * ?" 每小時的第0分0秒開始,每三分鐘觸發(fā)一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10點15分0秒觸發(fā)任務
"0 15 10 L * ?" 每個月最后一天的10點15分0秒觸發(fā)任務
"0 15 10 LW * ?" 每個月最后一個工作日的10點15分0秒觸發(fā)任務
"0 15 10 ? * 5L" 每個月最后一個星期四的10點15分0秒觸發(fā)任務
"0 15 10 ? * 5#3" 每個月第三周的星期四的10點15分0秒觸發(fā)任務
? 也可直接面向百度!
????????除了上面的借助cron表達式的方法,還有另一種觸發(fā)器,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設置循環(huán)間隔時間,不像cron表達式只能定義小于等于間隔59秒。
??????? 第二個小demo(在原有的基礎上進行操作):
??????? 1、定時任務執(zhí)行類
/**
* 定時任務執(zhí)行類
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {
@Value("${printTime.cron}")
private String cron;
//方式一:
//----------方式一從這開始----------
/*@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//動態(tài)使用cron表達式設置循環(huán)間隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
String s = "任務循環(huán)執(zhí)行中。。。。。。";
log.info("Current time: {}", LocalDateTime.now() + "---->" + s);
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//使用CronTrigger觸發(fā)器,可動態(tài)修改cron表達式來操作循環(huán)規(guī)則
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
}
});
}*/
//----------方式一到這結束----------
//方式二:
//----------方式二從這開始----------
private Long timer = 10000L;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//動態(tài)使用cron表達式設置循環(huán)間隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
String s = "任務循環(huán)執(zhí)行中。。。。。。";
log.info("Current time: {}", LocalDateTime.now() + "---->" + s);
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//使用CronTrigger觸發(fā)器,可動態(tài)修改cron表達式來操作循環(huán)規(guī)則
// CronTrigger cronTrigger = new CronTrigger(cron);
// Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
//使用不同的觸發(fā)器,為設置循環(huán)時間的關鍵,區(qū)別于CronTrigger觸發(fā)器,該觸發(fā)器可隨意設置循環(huán)間隔時間,單位為毫秒
PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
}
});
}
//----------方式二到這結束----------
}
??????? 2、增加一個修改時間的接口
@Slf4j
@RestController
@RequestMapping("/")
public class TaskController {
private final ScheduleTask scheduleTask;
@Autowired
public TaskController(ScheduleTask scheduleTask) {
this.scheduleTask = scheduleTask;
}
//方式一
// @GetMapping("/updateCron")
// public String updateCron(String cron){
// log.info("new cron :{}",cron);
// scheduleTask.setCron(cron);
// return "ok";
// }
//方式二
@GetMapping("/updateTimer")
public String updateTimer(Long timer){
log.info("new timer :{}",timer);
scheduleTask.setTimer(timer);
return "ok";
}
}
??????? 3、執(zhí)行測試結果
???????? 4、通過接口修改任務執(zhí)行時間
???????? 查看結果
文章來源:http://www.zghlxwxcb.cn/news/detail-480213.html
???????? 完成!文章來源地址http://www.zghlxwxcb.cn/news/detail-480213.html
到了這里,關于Spring Boot動態(tài)設置定時任務的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!