我正在使用Spring MVC,我正在尝试编写一个每小时运行一次的计划任务。问题在于,当应用程序启动时,它应该计算到下一个小时的持续时间,并将该值用作初始延迟。这样,计划任务可以在下午1点到下午2点......下午3点等确切时间运行。
在下面的代码中,我尝试计算@PostConstruct注释中的初始延迟。但是,当我尝试在@Scheduled注释中使用变量时,我收到以下错误消息:注释属性Scheduled.initialDelay的值必须是常量表达式
private LocalDateTime now;
private long delayUntilNextHour;
private long delayUntilNextDay;
@PostConstruct
public void initialize(){
now = LocalDateTime.now();
LocalDateTime nextHour = now.plusHours(1).withMinute(0).withSecond(0).withNano(0);
delayUntilNextHour = now.until(nextHour, ChronoUnit.MILLIS);
}
@Scheduled(initialDelay= delayUntilNextHour, fixedRate=3600000) //Runs every hour
public void test(){
//ADD LOGIC
hourMap.clear();
}
我无法插入" delayUntilNextHour"进入@Scheduled的initialDelay参数。我想知道是否有人能指出我如何解决这个问题的正确方向。
我试过让delayUntilNextHour成为一个静态final(常量),但它仍然不起作用。我也尝试了字符串变体" initialDelayString",但这也不起作用。
答案 0 :(得分:2)
在System.setProperty("delayUntilNextDay", delayUntilNextHour.toString());
方法中使用initialize()
并使用@Value("${delayUntilNextDay}")
来访问值
@Scheduled(initialDelay= @Value("${delayUntilNextDay}"), fixedRate=3600000) //Runs every hour
public void test(){
//ADD LOGIC
hourMap.clear();
}
我没有尝试过上面的代码。