概念
Quartz是一个开源的Java定时任务框架,它提供了一种简单、灵活的方式来执行定时任务。Quartz可以用于各种场景,如定时发送邮件、定期清理缓存、执行数据库备份等。
Quartz的主要特点包括:
-
强大的调度功能:Quartz支持多种调度策略,如SimpleTrigger(简单触发器)、CronTrigger(基于Cron表达式的触发器)和CalendarIntervalTrigger(基于日历间隔的触发器)。
-
可扩展性:Quartz允许用户自定义Job类,实现自己的业务逻辑。同时,Quartz还提供了丰富的API,方便用户进行任务管理和监控。
-
持久化存储:Quartz可以将任务信息存储在数据库中,以便在应用程序重启后能够恢复任务状态。
-
容错处理:Quartz具有故障转移机制,当某个任务执行失败时,可以自动重试或者跳过该任务。
-
易于集成: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());
}
}