在Java Spring MVC中使用@Scheduled注释中的常量表达式

时间:2017-11-23 06:59:03

标签: java spring spring-mvc

我正在使用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",但这也不起作用。

1 个答案:

答案 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();
}

我没有尝试过上面的代码。