【解决方案】Quartz 定时任务调度

112 阅读3分钟

概念

Quartz是一个开源的Java定时任务框架,它提供了一种简单、灵活的方式来执行定时任务。Quartz可以用于各种场景,如定时发送邮件、定期清理缓存、执行数据库备份等。

Quartz的主要特点包括:

  1. 强大的调度功能:Quartz支持多种调度策略,如SimpleTrigger(简单触发器)、CronTrigger(基于Cron表达式的触发器)和CalendarIntervalTrigger(基于日历间隔的触发器)。

  2. 可扩展性:Quartz允许用户自定义Job类,实现自己的业务逻辑。同时,Quartz还提供了丰富的API,方便用户进行任务管理和监控。

  3. 持久化存储:Quartz可以将任务信息存储在数据库中,以便在应用程序重启后能够恢复任务状态。

  4. 容错处理:Quartz具有故障转移机制,当某个任务执行失败时,可以自动重试或者跳过该任务。

  5. 易于集成:Quartz可以轻松地与Spring、Hibernate等流行的Java框架集成。

优点

  • 灵活性:Quartz提供了丰富的调度选项,包括简单的触发器和复杂的cron触发器,能够满足各种调度需求。
  • 持久性:Quartz支持将作业和触发器持久化到数据库中,确保即使应用程序重启,作业也能继续执行。
  • 集群支持:Quartz可以配置为集群模式,以提高作业执行的可靠性和可伸缩性。
  • 插件和扩展:Quartz允许开发人员创建和使用插件来扩展其功能,例如通过JobListener和TriggerListener来监听作业事件。
    • 丰富的调度模式:Quartz支持多种调度模式,如简单重复、间隔重复、滑动窗口等,可以满足大部分定时任务需求。
    • 持久化机制:Quartz可以将任务状态存储在数据库中,保证任务的高可用性和持久性。
    • 集群支持:Quartz支持分布式集群部署,可以实现高可用性和负载均衡。
    • 灵活的应用方式:Quartz支持任务和调度的多种组合方式,并支持调度数据的多种存储方式。
    • 监听器和插件:Quartz框架包含调度器监听、作业和触发器监听,可以通过插件进行扩展而不需要修改源码。

缺点

-   **配置相对复杂**:Quartz的配置相对复杂,需要一定的学习成本,并且其核心库依赖于JDBC,可能会产生额外的性能开销。
-   **缺少管理界面**:Quartz没有自带的管理界面,需要自行开发或使用第三方工具进行任务管理。
-   **不支持任务分片**:Quartz不支持任务分片,不适合大规模分布式任务处理。
-   **系统侵入性强**:Quartz需要将业务QuartzJobBean持久化到底层数据表中,系统侵入性严重。
-   **耦合度高**:调度逻辑和QuartzJobBean耦合在同一个项目中,随着任务数量和逻辑的增加,可能影响调度系统的性能。
-  **分布式限制**:虽然Quartz支持集群,但在分布式环境中,它可能不如一些专门为分布式设计的调度系统(如Elastic-Job或XXL-JOB)那样高效。

具体做法如下:

1.  创建调度器
1.  启动调度器
1.  定义数据核对方案JOB(业务逻辑)
1.  定义CRON触发器
1.  将Job和Trigger添加到调度器中

代码示例


public static void main(String[] args) {
    for (int i = 1; i <= 5; i++) {
        System.out.println("begin");
        try {
            // 创建调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            // 启动调度器
            scheduler.start();
            // 定义一个Job
            JobDetail job = JobBuilder.newJob( DataCheckPlanJob.class).withIdentity("Job:"+i, "group plan keyID:"+i).build();
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity("trigger_" + "keyID"+i, "数据核对"+i);
            // 定义CRON触发器,每隔1秒执行一次
            CronTrigger trigger = triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(" 0 */1 * * * ?").withMisfireHandlingInstructionFireAndProceed()).build();
            // 将Job和Trigger添加到调度器中
            scheduler.scheduleJob(job, trigger);
            System.out.println("end");

        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

    public static class DataCheckPlanJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
       //业务逻辑代码
       System.out.println("核对方案!"+context.getJobDetail().getKey().getName());
        System.out.println(GsonUtil.gson.toJson(context.getJobDetail().getKey()));
        System.out.println( new Date());
    }
}