Spring是否内置于Scheduler中。

时间:2013-10-03 06:43:46

标签: java spring scheduled-tasks quartz-scheduler

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

  • 使用Quartz调度程序

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

  • 如果我使用内置@Schedule注释中的Spring ,我的工作是否会持久 ..?我不介意在应用程序启动后是否安排了作业。我想要的就是不失去细节和触发器的工作。?
  • 如果,是否有可以遵循的任何其他选择,请记住我需要使用我的计划程序安排多个作业。?
  • 如果我该如何实现。我的触发器每个工作都不同。例如,我可能有一份工作安排在上午9点,另一份工作安排在上午8点30分,依此类推。
  • 如果不是调度程序,那么我是否可以使用机制来处理此问题。

有一点,我发现Quartz的文档不是很具描述性。我的意思是它适用于顶级配置,但在应用程序上配置它是一件痛苦的事。这只是一个侧面说明。与这个问题无关。

感谢帮助。 :)

2 个答案:

答案 0 :(得分:7)

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

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

  3. 没有上下文的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. 请参阅上面的示例。只要task-name和instanceIdentifier是唯一的,就可以安排任意数量的任务。

答案 1 :(得分:6)

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