quartz 任务调度逻辑梳理
引入jar包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
1.创建任务调度器
public static Scheduler createScheduler() throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
return scheduler;
}
2.创建要被执行的任务
public static JobDetail createJob() {
JobBuilder jobBuilder = JobBuilder.newJob(DemoJob.class); //第五点创建demojob
jobBuilder.withIdentity("jobName","myJob");
JobDetail jobDetail = jobBuilder.build();
return jobDetail;
}
3.创建任务时间触发器
public static Trigger createTrigger() {
// 创建时间触发器,按日历调度
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("triggerName","myTrigger")
.startNow() .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) /*每两秒触发一次*/
.build();
return trigger;
}
4.任务调度主程序
public static void main(String[] args) throws SchedulerException {
// 创建一个作业任务调度器
Scheduler scheduler = createScheduler();
// 创建一个被调度的任务
JobDetail job = createJob();
// 创建一个任务时间触发器
Trigger trigger = createTrigger();
// 使用调度器按照时间触发器执行这个作业任务
scheduler.scheduleJob(job,trigger);
scheduler.start();
}
5.创建一个job,实现job接口
public class DemoJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("定时任务被执行了");
}
}
elastic-job分布式调度框架
它是基于quartz二次开发的,在分布式环境中,任务能按调度策略进行,能够避免同一任务多实例重复进行
elastic使用
1.安装zookeeper
2.引入jar包
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>elastic-job-lite-core</artifactId>
<version>2.1.5</version>
</dependency>
3.配置zookeeper
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181","data-archive-job");
CoordinatorRegistryCenter coordinatorRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
coordinatorRegistryCenter.init();
4.配置任务
//1表示分片执行即分成1片执行
JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder("archive-job","*/2 * * * * ?",1).build();
SimpleJobConfiguration simpleJobConfiguration = new SimpleJobConfiguration(jobCoreConfiguration,BackupJob.class.getName());
5.配置任务类
public class BackupJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
//任务逻辑
System.out.println("elastic job 被执行了");
}
6.启动任务
new JobScheduler(coordinatorRegistryCenter, LiteJobConfiguration.newBuilder(simpleJobConfiguration).build()).init();
当创建多个实例的时候只有一个实例会作为leader来执行定时任务,谁先创建leader节点谁就是领导者,在instances节点中增加或减少子节点(即增加或减少任务调度的实例),都会触发leader重新选举,即使老leader没有挂掉,但是instances节点发生变化,也会触发重新选举