当前位置: 首页 > 知识库问答 >
问题:

Spring Boot,计划任务,双重调用

拓拔欣嘉
2023-03-14

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

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

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

计划任务执行两次(始终)。

从我目前收集的信息来看,这可能是因为加载了两个上下文,然后两次拿起了我的豆子。好啊既然所有配置基本上都是隐藏的Spring Boot魔法,那么我该如何修复/防止这种双重执行呢?

框架版本:

  • Spring靴1.3.5

主要用途:

   @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被拾取了两次,这大概意味着它被馈送到调度程序两次。那么如何防止这种情况呢?

共有1个答案

厍光霁
2023-03-14

有同样的问题,在我的情况下,原因是在@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天触发此任务?