Quartz(一)

1. Quartz是什么

Quartz官方网站:http://www.quartz-scheduler.org

  1. Quartz是一个功能丰富的、开源任务调度框架,几乎可以集成到任何Java应用中,小到单体引用,大到大型电子商务系统;

  2. Quartz可以用来创建和执行成千上万的简单或复杂调度任务;

  3. Quartz的任务被定义成一组标准的Java组件,几乎可以执行任何编程任务;

  4. Quartz包含很多企业级功能,包括JTA事务(分布式事务)和集群;

2. Quartz能做什么

  1. 定时发送邮件、短信

  2. 定时进行数据同步

  3. 定时删除超时订单

4. Quartz的核心API

  1. Job:创建Quartz任务必须实现的接口

  2. JobDetail:描述任务详细细节(描述任务名称、任务组)

  3. JobBuilder:用户创建JobDetail

  4. Trigger:定义任务的调度时机(规则)

    SimpleTrigger:定义任务开始时间、结束时间、每隔多长时间执行、执行多少次、执行多久

    CronTrigger:使用Cron表达式定义执行规则

  5. TriggerBudiler:创建Trigger

  6. Scheduler:使用Trigger定义规则去调度(执行)任务

  7. JobDataMap:JobDetail和Trigger可以通过它给Job传递参数

  8. JobKey、TriggerKey

  9. JobExectionContext

5. 使用代码测试SimpleTrigger

  1. Maven依赖

    <dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.0</version>
    </dependency>

     

  2. 测试的任务

    1. 每隔5秒打印一次Hello

    2. 任务5秒后开始执行,每隔5秒打印一次,重复打印10次

    3. 每隔5秒打印一次,30秒后停止

6. Cron表达式、测试CronTrigger

详见Quartz-Cron表达式.pdf

7. Spring整合单机版Quartz

  1. MethodInvokingJobDetailFactoryBean

    不需要任务对象实现Job接口

    需要自定义一个任务对象、在其中定义一个任意的方法即可

    还需要把这个任务对象注册为Spring Bean

     

  2. CronTriggerFactoryBean

     

  3. SchedulerFactoryBean

     

8. Quartz集群

  1. 可以通过集群实现服务的高可用(HA);

  2. 当集群中有一个任务执行时,其它任务不会执行;

  3. 当执行的任务服务出现故障,其它任务就会接管这个任务继续执行;

9. Spring整合集群版Quartz

Quartz通过JDBC方式将任务、任务执行状态...存储到数据库,通过数据库来传递任务执行情况(执行状态);

9.1 创建数据库和数据表

  1. 数据库直接使用et2006

  2. 数据表结构由Quartz提供

9.2 配置集群信息

  1. 集群名称、集群中实例的ID、线程配置、存储配置....

9.3 创建任务对象

  1. 要求任务对象继承QuartzJobBean

9.4 配置Spring Bean

  1. 数据源

  2. 事务管理器

  3. JobDetailFactoryBean

  4. CronTriggerFactoryBean

  5. ScheduleFactoryBean

    数据源

    事务管理器

    集群配置信息

    tiggers

 

9.5 解决集群中的Quartz任务无法使用Spring Bean的问题

9.5.1 使用applicationContextSchedulerContextKey属性

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="transactionManager"
           ref="transactionManager" />
 <!-- 集群配置 -->
 <property name="configLocation"
           value="classpath:quartz.properties" />
 <property name="triggers">
   <list>
     <ref bean="orderTrigger" />
   </list>
 </property>

 <!-- 属性applicationContextSchedulerContextKey: -->
 <property name="applicationContextSchedulerContextKey"
           value="aaaa" />
</bean>

 

9.5.2 继承SpringBeanJobFactory

@Service // spring bean
public class MvcJobFactory extends SpringBeanJobFactory {

 /** 可以将第三方创建的对象重新注入Spring容器中 */
 @Autowired
 AutowireCapableBeanFactory ioc;

 @Override
 protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
   // 调用父类createJobInstance创建任务
   Object job = super.createJobInstance(bundle);
   ioc.autowireBean(job);
   return job;
}
}
<!-- SchedulerFactoryBean -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="transactionManager"
           ref="transactionManager" />
 <!-- 集群配置 -->
 <property name="configLocation"
           value="classpath:quartz.properties" />
 <property name="triggers">
   <list>
     <ref bean="orderTrigger" />
   </list>
 </property>

 <property name="jobFactory" ref="mvcJobFactory" />
</bean>

 

上一篇:Fix Some bytes have been replaced with the Unicode substitution character while loading file XXX.cs with Chinese Simplified (GB2312) encoding


下一篇:.NET Core 2.2使用最新版的Quartz.Net3.0.7 入门教程