如何在 Spring 中 运行 工作 9:30 am 到 4:00 pm 每 5 分钟启动一次?
How to run a job in Spring Boot between 9:30 am to 4:00 pm every 5 mins?
目前我在应用程序中配置了以下 2 个 cron 表达式,但作业运行已超过 4:00 下午。
如下面的应用程序日志所示,即使在 4:00 下午之后,我也能看到记录器语句。不知道为什么。
application.properties
#Starts at 9:30 AM and ends at 10:00 AM. Runs every 5 mins
job.cron1=0 30-55/5 9 * * MON-FRI
#Starts at 10:00 AM and ends at 4:00 PM. Runs every 5 mins
job.cron2=0 */5 10-16 * * MON-FRI
PurgeData.java
@Scheduled(cron = "${job.cron1}")
public void purgeDBData1() {
log.info("Purging DB data every 5 mins between 9:30 am - 10:00 am...");
}
@Scheduled(cron = "${job.cron2}")
public void purgeDBData2() {
log.info("Purging DB data every 5 mins between 10:00 am - 4:00 pm...");
}
应用程序日志:
2021-03-02 16:05:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:10:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
...
....
.....
2021-03-02 16:45:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:50:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:55:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
你应该配置如下
job.cron2=0 */5 10-15 * * MON-FRI
您需要两个 cron 来处理九点半的开始。公共部分是周一至周五各5秒。请记住后面的值是包含在内的,因此范围必须是 15
,即 3pm
.
小时和分钟跨度不同:
0 30/5 9 ? * MON,TUE,WED,THU,FRI *
- 其中 30/5 9
表示从 9:30am 开始每 5 分钟仅在第 9 个小时(所以直到上午 10 点,不包括在内)。
0 0/5 10-15 ? * MON,TUE,WED,THU,FRI *
- 其中 0/5 10-15
表示从上午 10 点到下午 4 点(不含)每 5 分钟一班
您将需要使用 @Schedules
来定义嵌套的 @Scheduled
注释。
@Schedules ({
@Schedule(cron = "${job.cron1a}"), // a cron with 9:30am to 9:59am
@Schedule(cron = "${job.cron1b}") // a cron with 10am to 16pm
})
public void purgeDBData1() {
log.info("Purging DB data every 5 mins between 9:30 am - 10:00 am...");
}
目前我在应用程序中配置了以下 2 个 cron 表达式,但作业运行已超过 4:00 下午。
如下面的应用程序日志所示,即使在 4:00 下午之后,我也能看到记录器语句。不知道为什么。
application.properties
#Starts at 9:30 AM and ends at 10:00 AM. Runs every 5 mins
job.cron1=0 30-55/5 9 * * MON-FRI
#Starts at 10:00 AM and ends at 4:00 PM. Runs every 5 mins
job.cron2=0 */5 10-16 * * MON-FRI
PurgeData.java
@Scheduled(cron = "${job.cron1}")
public void purgeDBData1() {
log.info("Purging DB data every 5 mins between 9:30 am - 10:00 am...");
}
@Scheduled(cron = "${job.cron2}")
public void purgeDBData2() {
log.info("Purging DB data every 5 mins between 10:00 am - 4:00 pm...");
}
应用程序日志:
2021-03-02 16:05:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:10:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
...
....
.....
2021-03-02 16:45:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:50:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
2021-03-02 16:55:20,801 INFO job.PurgeDataJob [scheduling-1] Purging DB data every 5 mins between 10:00 am - 4:00 pm...
你应该配置如下
job.cron2=0 */5 10-15 * * MON-FRI
您需要两个 cron 来处理九点半的开始。公共部分是周一至周五各5秒。请记住后面的值是包含在内的,因此范围必须是 15
,即 3pm
.
小时和分钟跨度不同:
0 30/5 9 ? * MON,TUE,WED,THU,FRI *
- 其中30/5 9
表示从 9:30am 开始每 5 分钟仅在第 9 个小时(所以直到上午 10 点,不包括在内)。0 0/5 10-15 ? * MON,TUE,WED,THU,FRI *
- 其中0/5 10-15
表示从上午 10 点到下午 4 点(不含)每 5 分钟一班
您将需要使用 @Schedules
来定义嵌套的 @Scheduled
注释。
@Schedules ({
@Schedule(cron = "${job.cron1a}"), // a cron with 9:30am to 9:59am
@Schedule(cron = "${job.cron1b}") // a cron with 10am to 16pm
})
public void purgeDBData1() {
log.info("Purging DB data every 5 mins between 9:30 am - 10:00 am...");
}