Spring中定时任务Quartz集群配置学习
Spring中定时任务Quartz集群配置学习
原来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运行,没有任何错误日志,于是从jar包、JDK版本、cronExpression到服务器类型,甚至查到了服务器操作系统的类型,都没能找到解决的办法,后来才知道是集群惹的祸!
详细步骤如下:
1、 按照Quartz集群工作原理
图:表示了每个节点直接与数据库通信,若离开数据库将对其他节点一无所知
在数据库中建表。建表模版在Quartz包下docs/dbTables下,选择相应的数据库和版本即可。ORACLE的11个Table列表如下:
QRTZ_JOB_LISTENERS:存储有关已配置的 JobListener 的信息
- JOB_NAME
- JOB_GROUP
- JOB_LISTENER
QRTZ_TRIGGER_LISTENERS:存储已配置的 TriggerListener 的信息
QRTZ_FIRED_TRIGGERS:存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息
QRTZ_PAUSED_TRIGGER_GRPS:存储已暂停的 Trigger 组的信息
QRTZ_SCHEDULER_STATE:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态
- INSTANCE_NAME 之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字
- LAST_CHECKIN_TIME:上次检查时间
- CHECKIN_INTERVAL :检查间隔时间
QRTZ_LOCKS:存储程序的悲观锁的信息(假如使用了悲观锁)
QRTZ_SIMPLE_TRIGGERS:存储简单的Trigger,包括重复次数,间隔,以及已触的次数
- TRIGGER_NAME :qrtz_triggers表trigger_name的外键
- TRIGGER_GROUP:qrtz_triggers表trigger_group的外键
- REPEAT_COUNT :重复次数
- REPEAT_INTERVAL:时间间隔
- TIMES_TRIGGERED:触发次数
QRTZ_CRON_TRIGGERS:存储cron表达式表
- TRIGGER_NAME :qrtz_triggers表trigger_name的外键
- TRIGGER_GROUP:qrtz_triggers表trigger_group的外键
- CRON_EXPRESSION:cron表达式
- TIME_ZONE_ID :时区
QRTZ_TRIGGERS:保存trigger信息
- TRIGGER_NAME :trigger的名字,该名字用户自己可以随意定制,无强行要求
- TRIGGER_GROUP:所属组的名字,该名字用户自己随意定制,无强行要求
- JOB_NAME :qrtz_job_details表job_name的外键
- JOB_GROUP :qrtz_job_details表job_group的外键
- IS_VOLATILE 0
- DESCRIPTION
- NEXT_FIRE_TIME
- PREV_FIRE_TIME
- PRIORITY 5
- TRIGGER_STATE :当前trigger状态,设置为ACQUIRED,如果设置为WAITING,则job不会触发
- TRIGGER_TYPE:触发器类型,使用cron表达式
- START_TIME
- END_TIME
- CALENDAR_NAME
- MISFIRE_INSTR
- JOB_DATA
QRTZ_JOB_DETAILS:保存job详细信息,该表需要用户根据实际情况初始化
- JOB_NAME :集群中job的名字,该名字用户自己可以随意定制,无强行要求
- JOB_GROUP :集群中job的所属组的名字,该名字用户自己随意定制,无强行要求
- DESCRIPTION
- JOB_CLASS_NAME:集群中个note job实现类的完全包名,quartz就是根据这个路径到classpath找到该job类
- IS_DURABLE:是否持久化,把该属性设置为1,quartz会把job持久化到数据库中
- IS_VOLATILE
- IS_STATEFUL
- REQUESTS_RECOVERY
- JOB_DATA :一个blob字段,存放持久化job对象
QRTZ_CALENDARS:以 Blob 类型存储 Quartz 的 Calendar 信息
QRTZ_BLOB_TRIGGERS:作为 Blob 类型存储(用于 Quartz 用户用 JDBC创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
- TRIGGER_NAME :qrtz_triggers表trigger_name的外键
- TRIGGER_GROUP:qrtz_triggers表trigger_group的外键
- BLOB_DATA
2、 配置数据库连接池,如果spring已经配置则不需要再另行配置,只需在后面配置的applicationContext-quartz.xml引入即可。
applicationContext.xml:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:dataConfig.properties</value>
</property>
</bean>
<bean id="ds34" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${ds34.driver}</value>
</property>
<property name="url">
<value>${ds34.url}</value>
</property>
<property name="username">
<value>${ds34.username}</value>
</property>
<property name="password">
<value>${ds34.password}</value>
</property>
<property name="maxActive" value="5"></property>
<property name="maxIdle" value="20"></property>
<property name="maxWait" value="50"></property>
<property name="defaultAutoCommit" value="true"></property>
</bean>
dataConfig.properties:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:test
jdbc.username=test
jdbc.password=test
3、 配置quartz.properties
v org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同。
v org.quartz.scheduler.instanceId 属性为 AUTO即可,基于主机名和时间戳来产生实例 ID。
v org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。
v org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。
v org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(单位:毫秒)。Scheduler 检查是否其他的实例到了它们应当检入的时候未检入;这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval 越小,Scheduler 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)。
quartz.properties:
##Quartz 调度任务所需的配置文件
##org.quartz.scheduler.instanceName属性可为任何值,用在 JDBC JobStore 中来唯一标识实例,但是所有集群节点中必须相同。
org.quartz.scheduler.instanceName = HumsScheduler
##org.quartz.scheduler.instanceId 属性为 AUTO即可,基于主机名和时间戳来产生实例 ID。
org.quartz.scheduler.instanceId = AUTO
orgorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
##org.quartz.jobStore.class属性为 JobStoreTX,将任务持久化到数据中。
##因为集群中节点依赖于数据库来传播 Scheduler 实例的状态,你只能在使用 JDBC JobStore 时应用 Quartz 集群。
##这意味着你必须使用 JobStoreTX 或是 JobStoreCMT 作为 Job 存储;你不能在集群中使用 RAMJobStore。
orgorg.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
orgorg.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
##org.quartz.jobStore.isClustered 属性为 true,你就告诉了 Scheduler 实例要它参与到一个集群当中。
##这一属性会贯穿于调度框架的始终,用于修改集群环境中操作的默认行为。
org.quartz.jobStore.isClustered = true
##org.quartz.jobStore.clusterCheckinInterval 属性定义了Scheduler 实例检入到数据库中的频率(单位:毫秒)。
##Scheduler 检查是否其他的实例到了它们应当检入的时候未检入;这能指出一个失败的 Scheduler 实例,且当前 Scheduler 会以此来接管任何执行失败并可恢复的 Job。
##通过检入操作,Scheduler 也会更新自身的状态记录。clusterChedkinInterval 越小,Scheduler 节点检查失败的 Scheduler 实例就越频繁。默认值是 15000 (即15 秒)。
org.quartz.jobStore.clusterCheckinInterval = 20000
4、 配置applicationContext-quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
<property name="configLocation" value="classpath:quartz.properties"/>
<property name="triggers">
<list>
<ref bean="trigger1"/>
<!--
<ref bean="trigger2"/>
-->
</list>
</property>
</bean>
<bean id="jobDetail1" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="simpleService"/>
<property name="targetMethod" value="testMethod1"/>
<property name="shouldRecover" value="true"/>
</bean>
<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail1"/>
<property name="cronExpression" value="* 0/1 * ? * * *"/>
</bean>
<!--
<bean id="jobDetail2" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="simpleService"/>
<property name="targetMethod" value="testMethod2"/>
<property name="shouldRecover" value="true"/>
</bean>
<bean id="trigger2" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetail2"/>
<property name="startDelay" value="1"/>
<property name="repeatCount" value="100"/>
<property name="repeatInterval" value="1000"/>
</bean>
-->
</beans>
5、 配置Job任务注意:加入定时任务有两种方式:
① 继承QuartzJobBean的类,重写executeInternal(),详细写法:
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>继承QuartzJobBean的类的引用</value>
</property>
</bean>
②用org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean指定类和方法,但是直接使用会报java.io.NotSerializableException异常,一般用网上流传的(需要将两个类copy到自己的工程下,要有springJAR包,Job需要持久化到数据库中,SimpleService必须实现Serializable)frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean。详细写法:
<bean id="jobDetail1" class=" 工程里MethodInvokingJobDetailFactoryBean的路径.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="simpleService"/>
<property name="targetMethod" value="testMethod1"/>
<property name="shouldRecover" value="true"/>
</bean>
6、 配置到spring配置文件,自动调度任务。
<import resource="applicationContext-quartz.xml"></import>
7、 测试用例
public class MainTest {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext springContext = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml"});
}
}
Spring中定时任务Quartz集群配置学习相关推荐
- 项目中使用Quartz集群分享--转载
原文:http://hot66hot.iteye.com/blog/1726143 在公司分享了Quartz,发布出来,希望大家讨论补充. CRM使用Quartz集群分享 一:CRM对定时任务的依赖 ...
- quartz mysql 表 集群配置_Spring整合实战丨Quartz 集群配置
Quartz说明 1.quartz可以通过jdbc直连连接到MYSQL数据库,读取配置在数据库里的job初始化信息,并且把job通过java序列化到数据库里,这样就使得每个job信息得到了持久化,即使 ...
- Spring+Quartz 集群
转载 http://soulshard.iteye.com/blog/337886 单独的Quartz集群在http://unmi.blogjava.net/有Unmi翻译的Quartz Job Sc ...
- quartz集群分布式(并发)部署解决方案-Spring - 推酷
quartz集群分布式(并发)部署解决方案-Spring - 推酷 quartz集群分布式(并发)部署解决方案-Spring - 推酷 posted on 2015-09-05 16:03 lexus ...
- 在jenkins中连接kubernetes集群
在jenkins中连接kubernetes集群 配置kubernetes plugin连接kubernetes集群 1.点击系统管理->系统设置-添加一个云,在下拉菜单中选择kubernets并 ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:sundoctor www.iteye.com/blog/sundoctor-486 ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满 ...
- Springboot整合Quartz集群部署以及配置Druid数据源
参考链接: https://blog.csdn.net/wangmx1993328/article/details/105441308 https://blog.csdn.net/qq_3966905 ...
- Spring整合Quartz集群部署
Spring整合Quartz集群部署 Quartz的分布式模式 数据表创建 quartz.properties spring-job.xml Quartz的分布式模式 集群中的每个节点都是一个独立的Q ...
最新文章
- 一文读懂最近流行的CNN架构(附学习资料)
- 创建用于存放备份还原文件的网络文件夹(DPM配置管理系列七)
- OpenCV使用GDAL读取地理空间栅格文件
- __asm__ __volatile__ GCC的内嵌汇编语法 ATT汇编语言语法(Z)
- Oracle数据库空间突然增大,Oracle 表空间异常增长过快解决方法
- mysql dump hbase_导出mysqldump数据
- 反思风险管理的五项核心风险。
- poj 2777 Count Color 基础线段树,带给的初学者噩梦!!!
- 【转】细说@Html.ActionLink()的用法
- ICH E2B | ICSR 电子传输网关对接解决方案(CDE EDI)
- Ubuntu20.04安装有道云词典
- 记一款价廉物美的小型DAC+耳放----Dr.DAC
- 设置共享文件夹以计算机用户名和密码访问,Win10正式版系统怎么设置共享文件夹密码访问...
- 黄宁然——走过你来时的路
- Python微信操控itchat定时发送消息
- NVIDIA Jetson AGX Orin的计算能力
- SLAM 岗位求职与简历书写
- BITCS2016程序设计 | 9. 一夜发白 《千字文》
- sql2005如何修改服务器名称,sql2005 服务器名称设置
- 用SCI论文求婚!网友这波高级狗粮我吃……
热门文章
- cas单点注销失败Error Sending message to url endpoint
- BZOJ 3679 数位DP
- postgresql 用户安全配置
- 104种***清除方法
- 跨库事务处理 spring+hibernate+struts2+jta
- 欧盟委员会支持5个开源项目漏洞奖励计划,奖金池20万欧元
- 详细分析开源软件 ExifTool 的任意代码执行漏洞 (CVE-2021-22204)
- 详细分析 Sonlogger 任意文件上传漏洞 (CVE-2021-27964)
- 谷歌发布基于浏览器的 Spectre 攻击的 PoC exploit
- HackerOne 发布《2021年黑客报告》:黑客的动力、发展和未来