【问题标题】:Dynamic Job Scheduling using Spring 3使用 Spring 3 进行动态作业调度
【发布时间】:2012-08-23 04:24:11
【问题描述】:

我开发了一个网络爬虫,它以起始 URL 作为种子参数进行爬取。如果可能,我希望允许用户根据 Job 安排此任务。

目前我正在使用Spring 3.1.2Hibernate。我需要为用户提供一个接收 cronJob 参数的前端,并在此基础上运行爬虫。是否可以使用弹簧来做到这一点。

我读了一些关于Quartz 的文章,但是SO 或其他网站上的文章根本不清楚或不完整,以便完全了解如何在spring 中实现调度程序。

我知道它包含三个组成部分的基本知识

  1. 调度程序工厂
  2. 触发器
  3. 作业(要运行的服务)

我希望有人可以指导我正确的方向。

【问题讨论】:

    标签: java spring jakarta-ee spring-mvc scheduled-tasks


    【解决方案1】:

    Quartz 调度程序正是适合这项工作的工具。出于某种原因,几乎所有教程都专注于在启动时以 XML 定义作业 - 而 Quartz 完全能够(re-|un-)在运行时调度作业。

    您可以并且应该利用 Spring 来启动 Quartz 调度程序,但是您可以直接从您的代码中与它进行交互。这是一个简单的例子from the documentation

    JobDetail job = newJob(SimpleJob.class)
        .withIdentity("job1", "group1")
        .build();
    
    CronTrigger trigger = newTrigger()
        .withIdentity("trigger1", "group1")
        .withSchedule(cronSchedule("0/20 * * * * ?"))
        .build();
    
    scheduler.scheduleJob(job, trigger);
    

    在这里你定义一个job(一段要运行的Java代码),trigger(什么时候运行它,用户可以提供任何有效的CRON表达式)并把它包装起来通过安排它。 scheduler 实例可以由 Spring 注入。 Spring 也将处理正确的关闭。

    【讨论】:

    • 感谢您的回复。但是是否可以使用 spring 提供的TimerFactoryBean ScheduledTask 而不是使用 Quartz 来做到这一点。在文档中也提到了这种方法。你探索过吗?
    • newJob(...) 实际上是JobBuilder.newJob(...)。在上面的示例中,假设静态方法newJob(...) 是静态导入的,因此不需要通过其类名来引用它。
    • 这同样适用于TriggerBuilder.newTrigger()CronScheduleBuilder.cronSchedule(...)
    • @dhruvenkumar-shah 我没有找到任何关于动态执行此操作的文档,只有在您的应用程序启动时。
    猜你喜欢
    • 2022-01-04
    • 2022-04-12
    • 2016-03-14
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多