第一步:编写任务类;TaskJob,method job1 --代码省略
第二步:在spring配置文件头中添加命名空间及描述
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
第三步:spring配置文件中设置具体的任务
<task:scheduled-tasks>
<task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/>
task:scheduled-tasks>
<context:component-scan base-package="com.alibaba.mytask" />
QRTZ_FIRED_TRIGGERS:存储与已触发的Trigger相关的状态信息,以及相联job的执行信息;
QRTZ_PAUSED_TRIGGER_GRPS:存储已暂停的Trigger组的信息;
QRTZ_SCHEDULER_STATE:存储少量的有关Scheduler的状态信息,和别的Scheduler实例(假如是用于一个集群中)
QRTZ_LOCKS:存储程序的悲观锁的信息(假如使用了悲观锁)
QRTZ_SIMPLE_TRIGGERS:存储简单的Trigger,包括重复次数,间隔,以及已触的次数
QRTZ_SIMPROP_TRIGGERS:
QRTZ_CRON_TRIGGERS:存储Cron Trigger,包括Cron表达式和时区信息
QRTZ_BLOB_TRIGGERS:Trigger作为Blob类型存储(用于Quartz用户用JDBC创建他们自己定制的Trigger类型,JobStore并不知道如何存储实例的时候)
QRTZ_TRIGGERS:存储已配置的Trigger的信息
QRTZ_JOB_DETAILS:存储每一个已配置的Job的详细信息
QRTZ_CALENDARS:以Blob类型存储Quartz的Calendar信息
<servlet>
<servlet-name>QuartzInitializerservlet-name>
<display-name>Quartz Initializer Servletdisplay-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
servlet-class>
<load-on-startup>1load-on-startup>
<init-param>
<param-name>config-fileparam-name>
<param-value>/some/path/my_quartz.propertiesparam-value>
init-param>
<init-param>
<param-name>shutdown-on-unloadparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>start-scheduler-on-loadparam-name>
<param-value>trueparam-value>
init-param>
servlet>
#==============================================================
#Configure Main Scheduler Properties
#==============================================================
#配置集群时,quartz调度器的id,由于配置集群时,只有一个调度器,必须保证每个服务器该值都相同,可以不用修改,只要每个ams都一样就行
org.quartz.scheduler.instanceName = Scheduler1
#集群中每台服务器自己的id,AUTO表示自动生成,无需修改
org.quartz.scheduler.instanceId = AUTO
#==============================================================
#Configure ThreadPool
#==============================================================
#quartz线程池的实现类,无需修改
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#quartz线程池中线程数,可根据任务数量和负责度来调整
org.quartz.threadPool.threadCount = 5
#quartz线程优先级
org.quartz.threadPool.threadPriority = 5
#==============================================================
#Configure JobStore
#==============================================================
#表示如果某个任务到达执行时间,而此时线程池中没有可用线程时,任务等待的最大时间,如果等待时间超过下面配置的值(毫秒),本次就不在执行,而等待下一次执行时间的到来,可根据任务量和负责程度来调整
org.quartz.jobStore.misfireThreshold = 60000
#实现集群时,任务的存储实现方式,org.quartz.impl.jdbcjobstore.JobStoreTX表示数据库存储,以及事务的控制方式
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX/JobStoreCMT
#quartz存储任务相关数据的表的前缀,无需修改
org.quartz.jobStore.tablePrefix = QRTZ_
#连接数据库数据源名称,与下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以无需修改
org.quartz.jobStore.dataSource = myDS
#是否启用集群,启用,改为true,注意:启用集群后,必须配置下面的数据源,否则quartz调度器会初始化失败
org.quartz.jobStore.isClustered = true
#集群中服务器相互检测间隔,每台服务器都会按照下面配置的时间间隔往服务器中更新自己的状态,如果某台服务器超过以下时间没有checkin,调度器就会认为该台服务器已经down掉,不会再分配任务给该台服务器
org.quartz.jobStore.clusterCheckinInterval = 20000
#==============================================================
#Non-Managed Configure Datasource
#==============================================================
#配置连接数据库的实现类,可以参照IAM数据库配置文件中的配置
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#配置连接数据库连接,可以参照IAM数据库配置文件中的配置
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/test
#配置连接数据库用户名
org.quartz.dataSource.myDS.user = yunxi
#配置连接数据库密码
org.quartz.dataSource.myDS.password = 123456
#配置连接数据库连接池大小,一般为上面配置的线程池的2倍
org.quartz.dataSource.myDS.maxConnections = 10
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData
http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd
" version="1.5">
<calendar class-name="org.quartz.impl.calendar.HolidayCalendar" replace="true">
<name>holidayCalendarname>
<description>HolidayCalendardescription>
<base-calendar class-name="org.quartz.impl.calendar.WeeklyCalendar">
<name>weeklyCalendarname>
<description>WeeklyCalendardescription>
<base-calendar class-name="org.quartz.impl.calendar.AnnualCalendar">
<name>annualCalendarname>
<description>AnnualCalendardescription>
base-calendar>
base-calendar>
calendar>
<job>
<job-detail>
<name>testJob1name>
<group>testJobsgroup>
<description>Test Job Number 1description>
<job-class>personal.ruanyang.quartz.plugin.SimpleJobjob-class>
<volatility>falsevolatility>
<durability>falsedurability>
<recover>falserecover>
<job-data-map allows-transient-data="true">
<entry>
<key>test1key>
<value>test1value>
entry>
<entry>
<key>test2key>
<value>test2value>
entry>
job-data-map>
job-detail>
<trigger>
<cron>
<name>testTrigger1name>
<group>testJobsgroup>
<description>Test Trigger Number 1description>
<job-name>testJob1job-name>
<job-group>testJobsjob-group>
<cron-expression>0/15 * * ? * *cron-expression>
cron>
trigger>
job>
<job>
<job-detail>
<name>testJob2name>
<group>testJobsgroup>
<description>Test Job Number 2description>
<job-class>personal.ruanyang.quartz.plugin.SimpleJobjob-class>
<volatility>falsevolatility>
<durability>falsedurability>
<recover>falserecover>i)
job-detail>
<trigger>
<simple>
<name>testTrigger2name>
<group>testJobsgroup>
<description>Test Trigger Number 2description>
<calendar-name>holidayCalendarcalendar-name>
<job-name>testJob2job-name>
<job-group>testJobsjob-group>
<start-time>2004-02-26T12:26:00start-time>
<repeat-count>10repeat-count>
<repeat-interval>5000repeat-interval>
simple>
trigger>
job>
quartz>
两者对比
|
Quartz(RAM)+Tair
|
Quartz(JDBC)
|
优点
|
1、各节点不需要有中心,tair机制控制并发;
2、并发的控制能力由第三方组件提供,维护成本较低;
3、tair利用缓存比Quartz集群利用数据库效率可能略高(待测);
|
1、一个任务执行失败会有另一个节点的接替执行;
2、重启服务等动作导致此次任务失败后再次启动后可继续执行;
3、任务能被触发才会开启线程执行,不能触发则不会启动线程,提高资源利用率;
4、有内部的负载均衡机制,确保服务器都能得到执行权限;
|
缺点
|
1、容易形成死锁,且不会自动释放锁(现已优化,但还是有自动释放期限);
2、每个job到触发时间都会被触发,线程数增加,就集群而言资源利用率低;
3、job失败后不会有另一个节点接替执行;
4、job配置信息不会被持久化,重启服务器就会丢失,下次不会再继续执行;
|
1、job配置信息需要持久化到数据库中,11张表,数据库的检索能力会影响各节点的互通,同时维护成本会高些;
2、与tair(缓存)相比查询速度可能会有劣势;(可建索引优化)
3、水平集群如果时间节点不一致会出现混乱;
|
create index idx_qrtz_t_next_fire_time on qrtz_triggers(NEXT_FIRE_TIME);
create index idx_qrtz_t_state on qrtz_triggers(TRIGGER_STATE);
create index idx_qrtz_t_nf_st on qrtz_triggers(TRIGGER_STATE,NEXT_FIRE_TIME);
create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(TRIGGER_NAME);
create index idx_qrtz_ft_trig_group on qrtz_fired_triggers(TRIGGER_GROUP);
create index idx_qrtz_ft_trig_name on qrtz_fired_triggers(TRIGGER_NAME);
create index idx_qrtz_ft_trig_n_g on qrtz_fired_triggers(TRIGGER_NAME,TRIGGER_GROUP);
create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(INSTANCE_NAME);
create index idx_qrtz_ft_job_name on qrtz_fired_triggers(JOB_NAME);
create index idx_qrtz_ft_job_group on qrtz_fired_triggers(JOB_GROUP);