Spring内置的调度程序是持久的吗?



>我遇到了必须使用持久调度程序的情况,因为我有一个 Web 应用程序可能会因某些问题而崩溃或关闭,如果发生这种情况,可能会丢失它的工作详细信息。我尝试了以下方法:

  • 使用石英调度程序

我首先使用了RAMJobStore,但由于它不持久,所以没有多大帮助。无法设置JDBCJobStore因为,这将需要对我现有的代码库进行大量代码更改。鉴于这种情况,我有以下疑问:

  • 如果我使用 Spring 内置的@Schedule注释,我的作业会持久吗..?我不介意在应用程序启动后安排作业。我想要的只是工作不会丢失它们的详细信息和触发器。?
  • 如果没有,是否有任何其他可以遵循的替代方案,请记住,我需要使用调度程序安排多个作业。?
  • 如果是我该如何实现。?我的触发器因每个工作而异。例如,我可能有一份安排在上午 9 点的工作和另一份安排在上午 8 点 30 分的工作,依此类推。
  • 如果不是调度程序,那么我可以有一个机制来处理这个问题吗?

我发现的一件事是Quartz的文档不是很具有描述性。我的意思是,对于顶级配置来说这很好,但是在您的应用程序上配置它是一种痛苦。这只是一个旁注。与问题无关。

感谢您的帮助。 :)

  1. 不,Spring 的@Schedule注释通常只会指示 Spring 在什么时间应该安排某个任务在当前 VM 中运行。据我所知,也没有执行的背景。计划是静态的。

  2. 我也有类似的要求,并创建了db-scheduler(https://github.com/kagkarlsson/db-scheduler(,一个简单,持久和集群友好的调度程序。它将下一个执行时间存储在数据库中,并在达到执行时间后触发执行。

对于没有上下文的RecurringTask,一个非常简单的示例如下所示:

final RecurringTask myDailyTask = ComposableTask.recurringTask("my-daily-task", Schedules.daily(LocalTime.of(8, 0)),
                () -> System.out.println("Executed!"));
final Scheduler scheduler = Scheduler
        .create(dataSource)
        .startTasks(myDailyTask)
        .threads(5)
        .build();
scheduler.start();

它将在每天 08:00 执行名为 my-daily-task 的任务。首次启动调度程序时,它将在数据库中调度,除非它已存在于数据库中。

如果要将来的某个时间使用上下文计划临时任务,可以使用以下OneTimeTask

    final OneTimeTask oneTimeTask = ComposableTask.onetimeTask("my-onetime-task",
            (taskInstance, context) -> System.out.println("One-time task with identifier "+taskInstance.getId()+" executed!"));
    scheduler.scheduleForExecution(LocalDateTime.now().plusDays(1), oneTimeTask.instance("1001"));
  1. 请参阅上面的示例。可以计划任意数量的任务,只要任务名称和实例标识符是唯一的。
@Schedule

实际执行者无关。默认的java执行器不是持久性的(也许有一些特定于应用程序服务器的执行程序(,如果你想要持久性,你必须使用Quartz来执行作业。

最新更新