gpt4 book ai didi

java - Spring Boot、计划任务、双重调用

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:13 24 4
gpt4 key购买 nike

得到了一个非常标准的 Spring Boot (1.3.5) 应用程序。

使用@EnableScheduling启用调度(在主应用程序入口点和@Configuration注释类上尝试。

使用@Scheduled方法创建了一个简单的类(简单的fixedDelay时间表)。

计划任务执行两次(总是)。

根据我到目前为止收集到的信息,这可能是因为正在加载两个上下文,因此两次获取我的 bean。好的。那么我该如何修复/防止这种双重执行,因为所有配置基本上都隐藏了 Spring Boot 的魔力?

框架版本:

  • Spring Boot 1.3.5
  • Spring Cloud Brixton SR1

主要应用:

   @SpringBootApplication
@EnableDiscoveryClient
@EnableAsync
@EnableCircuitBreaker
public class AlertsApplication {

public static void main(final String[] args) {
SpringApplication.run(AlertsApplication.class, args);
}
}

我的任务类(HookCreateRequest 列表是从 application.yml 中提取的 - 我认为当前不相关,但如果需要,可以提供):

@ConditionalOnProperty(name = "init.runner", havingValue = "InitRunner")
@ConfigurationProperties(prefix = "webhook")
public class InitRunner /*implements CommandLineRunner*/ {

private final List<HookCreateRequest> receivers = new ArrayList<>();

@Autowired
private WebHookService hookService;

@Scheduled (fixedRate = 300000)
public void run() throws Exception {

getReceivers().stream().forEach(item -> {
log.debug("Request : {}", item);
hookService.create(item);
});

}

public List<HookCreateRequest> getReceivers() {
return receivers;
}

}

xml 配置为零。不确定还有什么可能相关?

编辑2016/07/04

我已修改为在运行时输出计划实例(我怀疑正在创建两个不同的实例)。但是,日志似乎表明它是任务对象的同一实例。日志:
15:01:16.170 调试 - Scheduled.ScheduleHookRecreation - 计划任务运行:schedule.ScheduleHookRecreation@705a651b
...任务发生
...第一次运行完成,然后:
15:01:39.050 调试-schedule.ScheduleHookRecreation-计划任务运行:schedule.ScheduleHookRecreation@705a651b
所以看起来它是同一个任务实例 (@705a651b)。现在为什么会以甜蜜的名义执行两次?

编辑2016/07/05

我在带有预定方法的类中添加了一个@PostConstruct方法,只有一些日志输出。通过这样做,我可以验证@PostConstruct方法被调用了两次——这似乎确认了bean被拾取了两次,这可能意味着它被馈送到调度程序两次。那么如何防止这种情况发生呢?

最佳答案

有同样的问题,在我的例子中,原因是 @Scheduled 注释的 initialDelay 参数缺失 - 在应用程序启动时调用方法。

关于java - Spring Boot、计划任务、双重调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com