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

长时间运行的spring计划任务

华化
2023-03-14

我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,

共有1个答案

萧越泽
2023-03-14

在spring framework中,一个调度任务只由一个线程执行,如果执行时间长于间隔周期,任务将被延迟,下面是一个简单的例子:

@Scheduled(cron = "0/3 * * * * *")
public void work() {
    log.info("begin to do some work,current thread is {}", Thread.currentThread().getName());
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        log.error(e.toString());
    }
}

我创建了一个计划任务,预期的执行顺序:0 3 6 9...但是任务需要更多的时间,所以执行顺序:0 6 12 18...

在spring中,所有任务都将由线程执行(默认),为了减少任务之间的干扰,我们可以支持一个线程池来执行shceduled任务,如下所示:

@Bean
public ThreadPoolTaskScheduler taskExecutor() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(20);
    return scheduler;
}
 类似资料:
  • 我们有10个计划任务,配置为每20秒运行一次,带有以下注释(它们在晚上停止,因为依赖系统在早上4点重新启动): 我们有一个线程池taks调度器,配置池大小为10: 有时在一天中,其中一项任务在一两个小时内没有执行,然后继续定期执行。有没有可能其中一个任务正在阻止其他任务?我怎样才能知道情况是否如此?

  • 我有一套使用spring框架用Java写的服务。一些服务有预定的任务(使用spring的< code>@Scheduled注释)来做一些内务处理(生成处理过的数据,数据清理等。).由于这些计划任务,我不能运行服务的多个实例,因为所有实例都选择相同的任务,并且多次执行,导致重复/损坏的数据。为了解决这个问题,我想在任务执行时进行检查,并且只允许在一个实例上执行。我该怎么做?这个问题有更好的解决方法吗

  • 问题内容: 是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,但不确定如何编写cron表达式以使其不定期运行。这一次,每天晚上8点触发。 有什么建议? 问题答案: 您可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多配置(包装了

  • 我们在Spring web应用程序中使用预定任务来发送提醒、每日摘要等: 每个调度任务调用一个给定的服务方法(上面伪代码中的fooService.bar())。我想监控每次处决持续多长时间。随着负载、数据或复杂性的增加,其中一些方法可能需要更长的时间。我可以给每个服务方法添加日志记录语句(现在大约有10个,但将来可能会更多),或者使用方面给每个方法添加一些秒表行为。但是,对于spring中的所有预

  • > 我需要在执行前一个任务后以不同的延迟一个接一个地运行计划的任务。示例。有一个任务列表和延迟列表。 现在我需要运行task1通过100ms,task2在task1之后通过9ms,task3在task2之后通过22ms等等。 我正在使用javafx。任务可以使用一些UI更新方法,例如更改节点位置。这迫使我使用平台。runLater()方法,因为如果不这样做,则会出现异常“Not on FX app

  • 我正在编写一个应用程序,它有一个cron作业,每60秒执行一次。应用程序配置为在需要时扩展到多个实例。我只想每60秒在一个实例上执行一次任务(在任何节点上)。开箱即用,我找不到解决这个问题的方法,我很惊讶以前没有人问过多次。我使用的是Spring 4.1.6。