注:关于单节点的Quartz使用在这里不做详细介绍,直接进阶为分布式集群版的
1.准备工作:
使用环境Spring4.3.5,Quartz2.2.3,持久化框架JDBCTemplate
pom文件如下
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.dzpykj
quartz-test
0.0.1-SNAPSHOT
war
UTF-8
4.3.5.RELEASE
org.quartz-scheduler
quartz
2.2.3
javax.servlet
javax.servlet-api
3.0.1
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-expression
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-test
${spring.version}
test
mysql
mysql-connector-java
5.1.38
commons-pool
commons-pool
1.6
commons-dbcp
commons-dbcp
1.4
org.springframework
spring-tx
4.3.5.RELEASE
org.springframework
spring-jdbc
4.3.5.RELEASE
org.apache.commons
commons-lang3
3.7
org.apache.maven.plugins
maven-war-plugin
2.6
maven-compiler-plugin
3.5.1
1.8
1.8
UTF-8
qt
2.数据库建表:11张
官网下载2.2.3地址:http://www.quartz-scheduler.org/downloads/
下载完后将下图的SQL文件中的语句拿到数据库执行
3.将该数据库配置到Quartz的配置文件quartz.properties中
org.quartz.scheduler.instanceName = TestScheduler1
org.quartz.scheduler.instanceId = AUTO
org.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 = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.maxMisfiresToHandleAtATime=10
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 10000
org.quartz.dataSource.myDS.driver =com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL =jdbc\:mysql\://127.0.0.1\:3306/quartz_test?useUnicode\=true&characterEncoding\=utf8&autoReconnect\=true
org.quartz.dataSource.myDS.user =root
org.quartz.dataSource.myDS.password =root
org.quartz.dataSource.myDS.maxConnections = 5
4.配置applicationContext-quartz.xml文件
5.建工具类
packagecom.dzpykj.plugins.quartz.dynamic;import staticorg.quartz.CronScheduleBuilder.cronSchedule;import staticorg.quartz.JobBuilder.newJob;import staticorg.quartz.TriggerBuilder.newTrigger;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.List;importorg.quartz.CronTrigger;importorg.quartz.JobDetail;importorg.quartz.JobKey;importorg.quartz.ObjectAlreadyExistsException;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.quartz.SchedulerFactory;importorg.quartz.TriggerKey;importorg.quartz.impl.StdSchedulerFactory;importorg.springframework.jdbc.core.JdbcTemplate;public classQuartzTaskUtils {public staticString addTask(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
String cronExp, Class jobClass, JdbcTemplate jdbcTemplate) {try{
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SchedulerFactory schedulerFactory= newStdSchedulerFactory();
Scheduler scheduler=schedulerFactory.getScheduler();
JobDetail jobDetail=newJob(jobClass).withIdentity(jobName, jobGroupName).build();
CronTrigger simpleTrigger=newTrigger().withIdentity(triggerName, triggerGroupName)
.withSchedule(cronSchedule(cronExp)).startNow().build();
Date ft=scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();
System.err.println("定时任务开始执行");
}catch(ObjectAlreadyExistsException e) {
e.printStackTrace();return "相同组内有重名的工作名称或者触发器名称";
}catch(SchedulerException e) {
e.printStackTrace();return "保存定时任务异常";
}return "success";
}public staticString removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
JdbcTemplate jdbcTemplate) {try{
String jobSql= "select * from qrtz_triggers where JOB_NAME = ? and JOB_GROUP = ?";
List jobList=jdbcTemplate.queryForList(jobSql, jobName, jobGroupName);if (jobList.size() < 1) {return "数据库没有该任务";
}
SchedulerFactory schedulerFactory= newStdSchedulerFactory();
Scheduler scheduler=schedulerFactory.getScheduler();
TriggerKey triggerKey= newTriggerKey(triggerName, triggerGroupName);
scheduler.pauseTrigger(triggerKey);//停止触发器
scheduler.unscheduleJob(triggerKey);//移除触发器
JobKey jobKey = newJobKey(jobName, jobGroupName);
scheduler.deleteJob(jobKey);//删除任务
} catch(SchedulerException e) {
e.printStackTrace();return "fail";
}return "success";
}
}
测试可能会用到的URL
测试Quartz分布式集群,分别两个端口启动Tomcat,各访访问一次,看控制台,在看数据库表,慢慢研究,可定会有收获
新增任务URL
http://127.0.0.1:8080/addTask?jobName=UserVisitCountJob1&jobGroupName=UserVisitCountJobGroup1&triggerName=simpleTrigger1&triggerGroupName=triggerGroup1
删除任务URL
http://127.0.0.1:8080/removeTask?jobName=UserVisitCountJob1&jobGroupName=UserVisitCountJobGroup1&triggerName=simpleTrigger1&triggerGroupName=triggerGroup1
以上只是将一些关键步骤说明
关于quartz.properties配置详解如下
#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
#quartz存储任务相关数据的表的前缀,无需修改
org.quartz.jobStore.tablePrefix=QRTZ_
#连接数据库数据源名称,与下面配置中org.quartz.dataSource.myDS的myDS一致即可,可以无需修改
org.quartz.jobStore.dataSource=myDS
#是否启用集群,启用,改为true,注意:启用集群后,必须配置下面的数据源,否则quartz调度器会初始化失败
org.quartz.jobStore.isClustered= false#集群中服务器相互检测间隔,每台服务器都会按照下面配置的时间间隔往服务器中更新自己的状态,如果某台服务器超过以下时间没有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