怎么在微信公众号建设微网站,电商网站建设技术,中国南京网站,搜索引擎广告优化1 任务调度整体流程 2 组件
调度器 #xff1a;工厂类创建Scheduler#xff0c;根据触发器定义的时间规则调度任务任务#xff1a;Job表示被调度的任务触发器#xff1a;Trigger 定义调度时间的元素#xff0c;按啥时间规则执行任务。一个Job可被多个Trigger关联#xf…1 任务调度整体流程 2 组件
调度器 工厂类创建Scheduler根据触发器定义的时间规则调度任务任务Job表示被调度的任务触发器Trigger 定义调度时间的元素按啥时间规则执行任务。一个Job可被多个Trigger关联但是一个Trigger 只能关联一个Job
import org.quartz.*;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;public class QuartzDemo {public static void main(String[] args) throws SchedulerException {// 创建JobDetail对象JobDetail jobDetail JobBuilder.newJob(MyJob.class).withIdentity(myJob, group1).build();// 创建Trigger对象Trigger trigger TriggerBuilder.newTrigger().withIdentity(myTrigger, group1).startNow().withSchedule(CronScheduleBuilder.cronSchedule(0/5 * * * * ?)).build();// 创建Scheduler对象Scheduler scheduler new StdSchedulerFactory().getScheduler();scheduler.start();// 将Job和Trigger注册到Schedulerscheduler.scheduleJob(jobDetail, trigger);}
}
执行任务调度核心类QuartzSchedulerThread
调度线程从JobStore中获取需要执行的的触发器列表并修改触发器的状态Fire触发器修改触发器信息(下次执行触发器的时间以及触发器状态并存储最后创建具体的执行任务对象通过worker线程池执行任务
3 集群部署方案
没有负责集中管理的节点而是利用数据库行级锁实现并发控制。
scheduler实例在集群模式先获取{0}LOCKS表中的行锁MySQL获取行锁 {0}会替换为配置文件默认配置的QRTZ_sched_name为应用集群的实例名lock_name就是行级锁名
1.3 Quartz的行级锁
触发器访问锁 (TRIGGER_ACCESS) 状态访问锁STATE_ACCESS 解决了任务的分布式调度问题同一个任务只能有一个节点运行其他节点将不执行任务当碰到大量短任务时各节点频繁的竞争数据库锁节点越多性能越差。 本文由博客一文多发平台 OpenWrite 发布