北京网站seo费用,网站可以做弹窗广告么,wordpress5.1.1编辑器还原,中国新闻社级别以下将分别从Quartz架构简介、集群部署实践、Quartz监控、集群原理分析详解Quartz任务调度框架。 Quartz简介 Quartz是Java领域最著名的开源任务调度工具#xff0c;是一个任务调度框架#xff0c;通过触发器设置作业的定时运行规则#xff0c;来执行定时任务。其中quartz集… 以下将分别从Quartz架构简介、集群部署实践、Quartz监控、集群原理分析详解Quartz任务调度框架。 Quartz简介 Quartz是Java领域最著名的开源任务调度工具是一个任务调度框架通过触发器设置作业的定时运行规则来执行定时任务。其中quartz集群通过故障切换和负载平衡的功能能给调度器带来高可用性和伸缩性。 Quartz提供了极为广泛的特性如持久化任务集群和分布式任务等。 其特点如下 完全由Java写成方便集成Spring 伸缩性 负载均衡 高可用性 典型的使用场景主要用来执行定时任务例如 定时发送信息 定时生成报表 自动更新静态数据 自动结账等等 Quartz架构简介 Quartz框架主要核心组件包括 1.Scheduler任务调度 是最核心的概念需要把JobDetail和Trigger注册到scheduler中才可以执行。 工厂模式组装各个组件 sched.scheduleJobjob, trigger; trigger 2.Job任务 其实Job是接口其中只有一个execute方法,我们只需要 implements 此接口重写 execute* 方法。 3.Trigger触发器 执行任务的规则比如每天每小时等。 一般情况使用SimpleTrigger和CronTrigger这些触发器实现了Trigger接口。或者 ScheduleBuilder 子类 SimpleScheduleBuilder和CronScheduleBuilder。 对于简单的时间来说比如每天执行几次使用SimpleTrigger。 对于复杂的时间表达式来说比如每个月15日上午几点几分使用CronTrigger以及CromExpression 类。 4.JobDetail任务细节 任务细节Quartz执行Job时需要新建个Job实例但是不能直接操作Job类所以通过JobDetail来获取Job的名称、描述信息。 调度器作为作业的总指挥触发器作为作业的操作者作业为应用的功能模块。 Quartz集群部署实践 Quartz与Spring结合使用Spring通过提供org.springframework.scheduling.quartz下的封装类对Quartz支持。 1.Quartz集群部署 Quartz集群中的每个节点是一个独立的Quartz应用它又管理着其他的节点。该集群需要分别对每个节点分别启动或停止不像应用服务器的集群独立的Quartz节点并不与另一个节点或是管理节点通信。Quartz应用是通过数据库表来感知到另一应用。只有使用持久的JobStore才能完成Quqrtz集群。 基于Spring的集群配置 quartzSchedulerclassorg.springframework.scheduling.quartz.SchedulerFactoryBeanquartzProperties quartz.scheduler.instanceNameCRMschedulerAUTOorg.quartz.simpl.SimpleThreadPool205org.quartz.impl.jdbcjobstore.JobStoreTXtrue150001120000QRTZ_...... org.quartz.jobStore.class属性为JobStoreTX将任务持久化到数据中。因为集群中节点依赖于数据库来传播Scheduler实例的状态你只能在使用JDBC JobStore时应用Quartz集群。
org.quartz.jobStore.isClustered属性为true通知Scheduler实例要它参与到一个集群当中。
org.quartz.jobStore.clusterCheckinInterval属性定义了Scheduler实例检入到数据库中的频率单位毫秒。Scheduler检查是否其他的实例到了它们应当检入的时候未检入这能指出一个失败的Scheduler实例且当前 Scheduler会以此来接管任何执行失败并可恢复的Job。通过检入操作Scheduler 也会更新自身的状态记录。clusterChedkinInterval越小Scheduler节点检查失败的Scheduler实例就越频繁。默认值是 15000 即15 秒。
其余参数在后文将会详细介绍。Quartz监控 Quartz实例的监控、操作以及动态部署Trigger. 1.Triggers监控 2.JobDetails监控 Quartz集群原理分析 1. Quartz集群数据库表 Quartz的集群部署方案在架构上是分布式的没有负责集中管理的节点而是利用数据库锁的方式来实现集群环境下进行并发控制。BTW分布式部署时需要保证各个节点的系统时间一致。 Quartz数据库核心表如下 Table NameDescriptionQRTZ_CALENDARS存储Quartz的Calendar信息 QRTZ_CRON_TRIGGERS存储CronTrigger包括Cron表达式和时区信息 QRTZ_FIRED_TRIGGERS存储与已触发的Trigger相关的状态信息以及相联Job的执行信息 QRTZ_PAUSED_TRIGGER_GRPS存储已暂停的Trigger组的信息QRTZ_SCHEDULER_STATE 2. Quartz线程模型 在Quartz中有两类线程: Scheduler调度线程 任务执行线程 任务执行线程Quartz不会在主线程QuartzSchedulerThread中处理用户的Job。 Quartz把线程管理的职责委托给ThreadPool一般的设置使用SimpleThreadPool。SimpleThreadPool创建了一定数量的WorkerThread实例来使得Job能够在线程中进行处理。WorkerThread是定义在SimpleThreadPool类中的内部类它实质上就是一个线程。例如CRM中配置如下 org.quartz.simpl.SimpleThreadPool205 QuartzSchedulerThread调度主线程QuartzScheduler被创建时创建一个QuartzSchedulerThread实例。 3.Quartz集群基于数据库锁的同步操作流程如下图所示 一个调度器实例在执行涉及到分布式问题的数据库操作前首先要获取QUARTZ_LOCKS表中对应的行级锁获取锁后即可执行其他表中的数据库操作随着操作事务的提交行级锁被释放供其他调度实例获取。集群中的每一个调度器实例都遵循这样一种严格的操作规程。 总结一下Quartz集群同步机制每当要进行与某种业务相关的数据库操作时先去QRTZ_LOCKS表中查询操作相关的业务对象所需要的锁在select语句之后加for update来实现。例如TRIGGER_ACCESS表示对任务触发器相关的信息进行修改、删除操作时所需要获得的锁。这时执行查询这个表数据的SQL形如
select * from QRTZ_LOCKS t where t.lock_nameTRIGGER_ACCESS for update当一个线程使用上述的SQL对表中的数据执行查询操作时若查询结果中包含相关的行数据库就对该行进行ROW LOCK若此时另外一个线程使用相同的SQL对表的数据进行查询由于查询出的数据行已经被数据库锁住了此时这个线程就只能等待直到拥有该行锁的线程完成了相关的业务操作执行了commit动作后数据库才会释放了相关行的锁这个线程才能继续执行。 通过这样的机制在集群环境下结合悲观锁的机制就可以防止一个线程对数据库数据的操作的结果被另外一个线程所覆盖从而可以避免一些难以觉察的错误发生。当然达到这种效果的前提是需要把Connection设置为手动提交即autoCommit为false。 你可能也喜欢: 史上最全Spring面试71题与答案 阿里P8架构师谈开源搜索引擎Lucene、Solr、Sphinx等优劣势比较