有一个非常标准的Spring Boot(1.3.5)应用程序。
使用@EnableScheduling
(在主应用程序入口点和@Configuration
注释类上尝试)启用调度。
使用@Scheduled
方法创建了一个简单的类(简单的fixedDelay时间表)。
计划任务执行两次(始终)。
从我目前收集的信息来看,这可能是因为加载了两个上下文,然后两次拿起了我的豆子。好啊既然所有配置基本上都是隐藏的Spring Boot魔法,那么我该如何修复/防止这种双重执行呢?
框架版本:
主要用途:
@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调试-已计划。ScheduleHookRecreation-计划任务运行:已计划。ScheduleHookRecreation@705a651b ...任务发生了。。。第一次运行完成,然后:15:01:39.050调试-已计划。ScheduleHookRecreation-计划任务运行:已计划。ScheduleHookRecreation@705a651b
所以看起来是同一个任务实例(@705a651b
)。现在为什么要以甜言蜜语的名义执行两次呢?
编辑2016/07/05
我在携带调度方法的类中添加了一个@PostConstrt
方法,其中只有一些日志输出。通过这样做,我可以验证@PostConf t
方法被html" target="_blank">调用了两次——这似乎证实了bean被拾取了两次,这大概意味着它被馈送到调度程序两次。那么如何防止这种情况呢?
有同样的问题,在我的情况下,原因是在@Schedtu
注释的初始延迟
参数缺失-方法在应用程序启动时被调用。
我用SpringBoot创建了一个简单的演示应用程序,其中包括执行器。带有@Scheduled注释的任务显示在执行器中,但以编程方式启动的任务不会显示。有没有办法让他们也出现? 我已经注释了@Enable调度。 我的组件如下所示: 执行器的结果仅显示带注释的任务:
计划任务系统使用说明 新版计划任务为用户提供了以下功能 创建一个计划任务 修改一个计划任务 删除计划任务 查看一个namespace的所有计划任务 查看一个namespcae的某个计划任务详细内容 查看一个计划任务的执行状况 查看任务的日志 查看创建的计划任务列表和某个计划任务的详细信息。 点击计划任务v2,进入计划任务列表,在这里可以看到用户名下的所有计划任务,点击一个计划任务,可以看到该计划任
我有一个简单的计划任务,它是使用@计划注释创建的。类似这样的东西- 我还有一个蓝绿色升级场景,在这个场景中,这个计划任务可能会在蓝色和绿色集群中运行。鉴于这个计划任务修改了数据库,其中一个节点可能会覆盖来自另一个节点的数据——或者最坏情况下的竞争条件。 我想暂停绿色集群上所有计划的任务,直到它准备好接受流量。我已经有了代码来监听应用程序状态的变化。 我探索了几个选择- 只需在任务开始时添加一个布尔
问题内容: 我在Java文档中看到了这一点:ScheduledAtFixedRate,它说 如果该任务的任何执行遇到异常,将禁止后续执行 我不希望在我的应用程序中发生这种情况。即使看到异常,我也总是希望后续执行继续进行。我怎样才能从。 问题答案: 用try / catch包围Callable.call方法或Runnable.run方法… 例如: 请注意,捕获除编译器也告诉您的内容之外的其他内容(在
亚马逊宣布了AWS Lambda(http://AWS.Amazon.com/Lambda/)。 产品说明包括: 计划任务 AWS Lambda函数可以由外部事件计时器触发,因此可以在定期计划的维护时间或非高峰时段运行函数。例如,您可以触发一个AWS Lambda函数,在非繁忙时间执行每晚的存档清理。 当我读到这篇文章时,我明白了我终于可以有一种方法来始终如一地完成“类似朋党”的任务。我想每天下午
我在Spring 3中使用@Scheduled annotation。我需要每周或每两周运行一些任务,所以我使用cron表达式作为参数,例如。 我的问题是,如果我将创建必须每7天运行一次的计划任务,并且在第6天我将重新启动服务器(与战争重新部署),它会重置这个计划任务(我需要再次等待7天)还是它会保存其状态并在第7天触发此任务?