最近写的一个项目使用到了Quartz这个插件,我也了解了一下,基本是用于定时任务的功能。之后写了一个demo把这个功能单独提取出来了。
(1)首先看下这个demo的结构:
再来看下主要代码:
调度器QuartzConfig.java:
package quart;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/**
* 2017/12/28.
*/
public class QuartzConfig {
public Scheduler scheduler() throws SchedulerException {
// 通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
// 通过schedulerFactory获取一个调度器
Scheduler scheduler = schedulerfactory.getScheduler();
return scheduler;
}
}
设置任务具体Quartz:
package quart;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
public class Quartz {
private static String JOBGROUP = "group1";
public static CronTrigger addOrUpdateQuartz() throws SchedulerException{
//设置任务id
Long taskid = (long) 2;
//设置任务执行特殊字符串
String CronValue = "*/1 * * * * ? *";
QuartzConfig quartzConfig = new QuartzConfig();
Scheduler scheduler = quartzConfig.scheduler();
CronTrigger trigger = null;
try {
//获取触发器标识
TriggerKey triggerKey = TriggerKey.triggerKey(taskid.toString(), JOBGROUP);
//获取触发器trigger
trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if(null==trigger){//不存在任务
//创建任务
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.withIdentity(taskid.toString(), JOBGROUP)
.build();
jobDetail.getJobDataMap().put("taskId", taskid);
//表达式调度构建器
//这里的时间也可以通过页面传送过来。具体怎么写请看上一篇quartz介绍
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(CronValue).withMisfireHandlingInstructionDoNothing();
//按新的cronExpression表达式构建一个新的trigger
//手动的优先级为5 自动的优先级按照高中低为3,2,1
int priority = 3;
TriggerBuilder<CronTrigger> builder = TriggerBuilder.newTrigger()
.withIdentity(taskid.toString(), JOBGROUP)
.withPriority(priority)
.withSchedule(scheduleBuilder);
builder.startAt(new Date());
builder.endAt(new Date(2018,8,30));
//builder.startNow();
trigger = builder.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}else{//存在任务
// Trigger已存在,那么更新相应的定时设置
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(CronValue);
//按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(scheduleBuilder)
.build();
//按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
} catch (SchedulerException e) {
//throw new BusinessException("该任务无效!");
}
return trigger;
}
}
这里解释下代码:首先设置任务执行时间:String CronValue = "*/1 * * * * ? *";具体表达式怎么写,请读者自行百度,我这里设置是每隔一秒的时间。就去执行干活操作。
要干的活:
package quart;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 定时任务发送请求 Created by ruby_ on 2017/12/28.
*/
public class QuartzJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
/**
* 这里就是要这个定时器,按照你的定时去做什么事情,可以连接数据库,查询数据等等,这里我是让他不断打印这个东西
*/
System.out.println("干活去咯---");
}
}
最后再来个主程序启动它
package quart;
import org.quartz.CronTrigger;
import org.quartz.SchedulerException;
public class main {
public static void main(String[] args) throws SchedulerException {
System.out.println("开始");
CronTrigger c= Quartz.addOrUpdateQuartz();
System.out.println("---"+c);
}
}
最后的执行结果就是这样:
刚接触,有许多不懂,欢迎大佬补充