下面介绍Quartz入门的示例,项目地址: quartz-demo
由于Quartz的存储方式分为RAM和JDBC,分别对这两种进行简单的说明。并附上代码!
首先需要添加Quartz的依赖 ,我使用的是quartz.2.2.3版本!
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
RAM方式
要测试RAMdemo的代码,请先删除demo中这个quartz.properties文件,或者重命名!否则会测试不成功!
(1):Job
package com.wyj.exampleRAM;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* RAMjob
*
*
* @author:WangYuanJun
* @date:2017年12月28日 下午10:03:31
*/
public class RAMJob implements Job{
private Logger logger = LoggerFactory.getLogger(RAMJob.class);
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.debug("hello world ! hello Quartz - "+new Date());
}
}
(2):JobTest
package com.wyj.exampleRAM;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* RAMtest
*
*
* @author:WangYuanJun
* @date:2017年12月28日 下午10:03:50
*/
public class RAMQuartzTest {
private static Logger logger = LoggerFactory.getLogger(RAMJob.class);
public static void main(String[] args) throws SchedulerException {
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail
JobDetail jb = JobBuilder.newJob(RAMJob.class)
.withDescription("this is hello job")//job的描述
.withIdentity("helloJob", "helloGroup")//job 的name和group
.build();
//任务运行的时间,SimpleSchedle类型触发器有效
long time= System.currentTimeMillis() + 3*1000L; //3秒后启动任务
Date statTime = new Date(time);
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger trigger = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("helloTrigger", "helloTriggerGroup")
.startAt(statTime)//默认当前时间启动
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))//两秒执行一次
.build();
//5.注册任务和定时器
scheduler.scheduleJob(jb, trigger);
//6.启动 调度器
scheduler.start();
logger.debug("启动时间 :"+new Date());
}
}
运行结果:
SimpleScheduleBuilder:
CronScheduleBuilder:
JDBC方式
使用jdbc方式,就要配置quartz.properties文件,并且在开始的时候在数据库中新增表!
我使用的数据库是mysql,数据库中表在wyj-quartz-demo项目里面有,需要的请在里面下载!
运行 tables_mysql.sql 这个文件。
#配置数据源属性
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL:jdbc:mysql://192.168.99.100:3306/quartz_test?useUnicode=true&characterEncoding=utf-8
org.quartz.dataSource.qzDS.user:root
org.quartz.dataSource.qzDS.password:admin
org.quartz.dataSource.qzDS.maxConnections:10
(1)job
package com.wyj.exampleJDBC;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* JdbcJob
*
*
* @author:WangYuanJun
* @date:2017年12月28日 下午10:04:03
*/
public class JdbcJob implements Job{
private Logger logger = LoggerFactory.getLogger(JdbcJob.class);
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.debug("MyJDBCJob is start ...");
logger.debug("MyJDBCJob quzrtz "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
logger.debug("MyJDBCJob is end ...");
}
}
(2)jobTest
package com.wyj.exampleJDBC;
import java.util.List;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
* JdbcJobtest
*
*
* @author:WangYuanJun
* @date:2017年12月28日 下午10:04:14
*/
public class QuartzJdbcTest {
public static void main(String[] args) {
testStartSchedule();
// resumeJob();
}
/**
* 开始一个simpleSchedule()调度
*/
public static void testStartSchedule(){
try {
// 1、创建一个JobDetail实例,指定Quartz
JobDetail jobDetail = JobBuilder.newJob(JdbcJob.class)
// 任务执行类
.withIdentity("job_1", "jGroup1")// 任务名,任务组
.build();
//触发器类型
// SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForTotalCount(5); // 设置执行次数
CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");
// 2、创建Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger_1","triggerGroup1")
.withSchedule(builder)
.build();
// 3、创建Scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
// 4、调度执行
scheduler.scheduleJob(jobDetail,trigger);
try {
Thread.sleep(60000);
} catch (Exception e) {
e.printStackTrace();
}
//关闭调度器
scheduler.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 从数据库中找到已经存在的job,并重新开户调度
*/
public static void resumeJob(){
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobKey jobKey = new JobKey("job1_1", "jGroup1");
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
//SELECT TRIGGER_NAME, TRIGGER_GROUP FROM {0}TRIGGERS WHERE SCHED_NAME = {1} AND JOB_NAME = ? AND JOB_GROUP = ?
// 重新恢复在jGroup1组中,名为job1_1的 job的触发器运行
if(triggers.size() > 0){
for (Trigger tg : triggers) {
// 根据类型判断
if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) {
// 恢复job运行
scheduler.resumeJob(jobKey);
}
}
scheduler.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
数据库信息:
控制台信息:
注意:Cron和Simple类型,Simple类型的如果JobDetail没有设置.storeDurably(true),则job在运行完成之后会在数据库中删除!