当前位置: 首页 > 面试题库 >

Spring计划任务-仅运行一次

夹谷英奕
2023-03-14
问题内容

是否可以在确切指定的时间仅安排一次Spring服务方法?例如,当前时间是下午2点,但是当我按下操作按钮时,我希望我的服务方法从晚上8点开始。我熟悉@Scheduled批注,但不确定如何编写cron表达式以使其不定期运行。这一次@Scheduled(cron = "0 0 20 * * ?"),每天晚上8点触发。
有什么建议?


问题答案:

您可以使用Spring的TaskScheduler的实现之一。我在下面提供了一个示例,该示例不需要太多配置(包装了单线程调度执行程序的ConcurrentTaskScheduler)。

最简单的方法是一个仅使用Runnable和Date的命名 调度 。这将导致任务 指定时间 后运行一次
。所有其他方法都可以安排任务重复运行。

了解有关任务执行和计划的更多信息

简单的工作示例:

private TaskScheduler scheduler;

Runnable exampleRunnable = new Runnable(){
    @Override
    public void run() {
        System.out.println("Works");
    }
};

@Async
public void executeTaskT() {
    ScheduledExecutorService localExecutor = Executors.newSingleThreadScheduledExecutor();
    scheduler = new ConcurrentTaskScheduler(localExecutor);

    scheduler.schedule(exampleRunnable,
            new Date(1432152000000L));//today at 8 pm UTC - replace it with any timestamp in miliseconds to text
}

...

executeTaskT() //call it somewhere after the spring application has been configured

注意事项

要启用对@Scheduled和@Async批注的支持,请将@EnableScheduling和@EnableAsync添加到您的@Configuration类之一

更新 -取消计划的任务

TaskScheduler的schedule方法返回ScheduledFuture,它是一个可以 延迟取消结果延迟动作

因此,为了取消它,您需要保留计划任务的句柄(即保留ScheduledFuture返回对象)。

更改上面用于取消任务的代码:

  1. 在executeTaskT方法之外声明ScheduledFuture。

    private ScheduledFuture scheduledFuture;
    
  2. 修改您的计划调度以使返回对象保持不变:

    scheduledFuture = scheduler.schedule(exampleRunnable,
                    new Date(1432152000000L));
    
  3. 在代码中某处的cheduleFuture对象上调用cancel

    boolean mayInterruptIfRunning = true;
    scheduledFuture.cancel(mayInterruptIfRunning);
    


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

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

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

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

  • 我正在尝试用ECS Fargate设置一个计划的任务,但我不知道为什么它没有运行。我可以使用确认任务正常工作,但当我试图按计划触发它时,得到的只是一堆没有任何解释的'failedinvocations'。 虽然我知道规则正在被触发,所以这是一个好的迹象。见下方截图: 但每次触发它时,只有一个“FailedInvocation”。安排规则如下: 谢谢 编辑:区域现在支持此操作。请参阅备注。

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