我需要具有Cron知识的人一些帮助。我正在尝试编写Cron表达式,该表达式应该在星期二每周运行一次,如果今天是星期二,则从星期三开始运行一次。我当前的解决方案是:
0 0 * * 2,3
此表达式在星期二和星期三的00:00运行Cron。 但是如果今天是星期二,它将无法运行,因为时间早于00:00。如果我将时间设置为当前小时和分钟,比如说16:30,那么Cron将从现在的星期二开始,但是随后的星期三也将从16:30开始。我想尽快开始所有下一次Сron事件,即在周三的00:00
是否有可能完全解决此任务?非常感谢您的帮助。
答案 0 :(得分:1)
似乎您想在每个TUE和WED的午夜运行作业,并且还想在应用程序从TUE或WED启动时立即运行。不知道并且从未听说过的cron表达式可以处理“立即启动”的行为。但是您可以简单地使用@PostConstruct
来实现它:
public class CronJob {
@PostConstruct
public void onStart() {
LocalDateTime now =LocalDateTime.now();
if(now.getDayOfWeek() == DayOfWeek.TUESDAY || now.getDayOfWeek() == DayOfWeek.WEDNESDAY ) {
if(!now.toLocalTime().equals(LocalTime.MIDNIGHT)) {
doJob();
}
}
}
@Scheduled(cron="0 0 * * 2,3")
public void onSchedule() {
doJob();
}
public void doJob(){
//do the job
}
}
答案 1 :(得分:1)
您可以实现以下类型的三重cron:
* * * * 2 [ ! -e "$HOME/cronflag2" ] && touch "$HOME/cronflag2" && command
* * * * 3 [ ! -e "$HOME/cronflag3" ] && touch "$HOME/cronflag3" && command
0 0 * * 4 rm "$HOME/cronflag2" "$HOME/cronflag3"
只有标志文件不可用时,才会执行第一个命令。如果不可用,它将执行并执行命令。