Spring调度任务——只运行一次

新手上路,请多包涵

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

有什么建议么?

原文由 shx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以使用 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;

  1. 修改对 schedule 的调用以保持返回对象不变:
     scheduledFuture = scheduler.schedule(exampleRunnable,
                    new Date(1432152000000L));

  1. 在代码中某处的 scheduledFuture 对象上调用取消
    boolean mayInterruptIfRunning = true;
    scheduledFuture.cancel(mayInterruptIfRunning);

原文由 Laurentiu L. 发布,翻译遵循 CC BY-SA 4.0 许可协议

死人的解决办法:

 @Scheduled(initialDelay = 1000 * 30, fixedDelay=Long.MAX_VALUE)

在它再次开火之前你就已经死了。

原文由 Rick Ahlander 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题