Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是春天';s内置的调度程序是持久的。?_Java_Spring_Scheduled Tasks_Quartz Scheduler - Fatal编程技术网

Java 是春天';s内置的调度程序是持久的。?

Java 是春天';s内置的调度程序是持久的。?,java,spring,scheduled-tasks,quartz-scheduler,Java,Spring,Scheduled Tasks,Quartz Scheduler,我遇到了一个必须使用持久调度程序的情况,因为我有一个web应用程序可能会由于一些问题而崩溃或关闭,如果发生这种情况,可能会丢失它的作业详细信息。我尝试了以下方法: 使用Quartz调度程序: 我首先使用了RAMJobStore,但由于它不是持久性的,所以没有多大帮助。无法设置JDBCJobStore,因为这将需要对现有代码库进行大量的代码更改。 在这种情况下,, 我有以下疑问: 如果我使用Spring的内置@Schedule注释,我的作业会持久吗。。?我不介意在应用程序启动后安排作业。我只

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

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

  • 如果我使用Spring的内置
    @Schedule
    注释,我的作业会持久吗。。?我不介意在应用程序启动后安排作业。我只希望这些工作不会丢失它们的细节和触发因素
  • 如果不是,是否有可以遵循的任何其他备选方案,请记住,我需要使用调度程序调度多个作业
  • 如果我如何实现这一点。?我的触发器在每项工作中都是不同的。例如,我可能有一份工作安排在上午9点,另一份工作安排在上午8点30分等等
  • 如果不是调度程序,那么我可以有一个机制来处理这个问题吗
有一件事,我发现Quartz的文档不是很有描述性。我的意思是,对于顶级配置来说这很好,但是在应用程序上配置它是一件痛苦的事情。这只是旁注。与这个问题无关


感谢您的帮助。:)

@Schedule
与实际执行人无关。默认的java执行器不是持久的(可能有一些特定于应用服务器的执行器是持久的),如果您想要持久化,就必须使用它们来执行作业

  • 不,Spring的@Schedule注释通常只指示Spring在什么时候应该在当前VM中运行某个任务。据我所知,执行也没有上下文。时间表是静态的

  • 我有一个类似的需求,并创建了db scheduler(),一个简单、持久和集群友好的调度器。它将下一次执行时间存储在数据库中,并在到达时触发执行

  • 没有上下文的
    重复任务
    的一个非常简单的示例如下所示:

    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"));
    
  • 请参见上面的示例。只要任务名称和instanceIdentifier是唯一的,就可以安排任意数量的任务

  • 为什么使用
    jdbjobstore
    需要更改代码?!嗯。。不是吗。。?我可以为quartz设置一个属性文件,然后用它来完成吗?这需要对调度和quartz部分进行一些配置(并且您可能无法再使用@Scheduled,因为您需要使用quartz
    作业
    界面)。有一些参考资料。