标签:Quartz Spring 任务 quartz 集群 执行
1. Quartz是什么
Quartz官方网站:http://www.quartz-scheduler.org
-
Quartz是一个功能丰富的、开源任务调度框架,几乎可以集成到任何Java应用中,小到单体引用,大到大型电子商务系统;
-
Quartz可以用来创建和执行成千上万的简单或复杂调度任务;
-
Quartz的任务被定义成一组标准的Java组件,几乎可以执行任何编程任务;
-
Quartz包含很多企业级功能,包括JTA事务(分布式事务)和集群;
2. Quartz能做什么
-
定时发送邮件、短信
-
定时进行数据同步
-
定时删除超时订单
4. Quartz的核心API
-
Job:创建Quartz任务必须实现的接口
-
JobDetail:描述任务详细细节(描述任务名称、任务组)
-
JobBuilder:用户创建JobDetail
-
Trigger:定义任务的调度时机(规则)
SimpleTrigger:定义任务开始时间、结束时间、每隔多长时间执行、执行多少次、执行多久
CronTrigger:使用Cron表达式定义执行规则
-
TriggerBudiler:创建Trigger
-
Scheduler:使用Trigger定义规则去调度(执行)任务
-
JobDataMap:JobDetail和Trigger可以通过它给Job传递参数
-
JobKey、TriggerKey
-
JobExectionContext
5. 使用代码测试SimpleTrigger
-
Maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency> -
测试的任务
-
每隔5秒打印一次Hello
-
任务5秒后开始执行,每隔5秒打印一次,重复打印10次
-
每隔5秒打印一次,30秒后停止
-
6. Cron表达式、测试CronTrigger
详见Quartz-Cron表达式.pdf
7. Spring整合单机版Quartz
-
MethodInvokingJobDetailFactoryBean
不需要任务对象实现Job接口
需要自定义一个任务对象、在其中定义一个任意的方法即可
还需要把这个任务对象注册为Spring Bean
-
CronTriggerFactoryBean
-
SchedulerFactoryBean
8. Quartz集群
-
可以通过集群实现服务的高可用(HA);
-
当集群中有一个任务执行时,其它任务不会执行;
-
当执行的任务服务出现故障,其它任务就会接管这个任务继续执行;
9. Spring整合集群版Quartz
Quartz通过JDBC方式将任务、任务执行状态...存储到数据库,通过数据库来传递任务执行情况(执行状态);
9.1 创建数据库和数据表
-
数据库直接使用et2006
-
数据表结构由Quartz提供
9.2 配置集群信息
-
集群名称、集群中实例的ID、线程配置、存储配置....
9.3 创建任务对象
-
要求任务对象继承QuartzJobBean
9.4 配置Spring Bean
-
数据源
-
事务管理器
-
JobDetailFactoryBean
-
CronTriggerFactoryBean
-
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>
标签:Quartz,Spring,任务,quartz,集群,执行 来源: https://www.cnblogs.com/Jackzkj/p/14151908.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。