我正在使用 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设置为静态最终(常量),但它仍然不起作用。我也尝试过字符串变体“initialDelayString”,但这也不起作用。
最佳答案
在 initialize()
方法中使用 System.setProperty("delayUntilNextDay", delayUntilNextHour.toString());
并使用 @Value("${ delayUntilNextDay}")
来访问该值
@Scheduled(initialDelay= @Value("${delayUntilNextDay}"), fixedRate=3600000) //Runs every hour
public void test(){
//ADD LOGIC
hourMap.clear();
}
我还没有尝试过上面的代码。
关于java - Java Spring MVC 中@Scheduled 注解中常量表达式的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47449359/