一、新建一个maven工程,导包如下,其他的准备工作就是spring的一些基础配置,这里就不赘述配置了,该例子使用sh框架整合查询数据库!
二、数据库设计如下
CREATE TABLE `jobinfo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`job_name` varchar(255) NOT NULL,
`job_group` varchar(255) NOT NULL,
`job_status` int(11) NOT NULL DEFAULT '0',
`job_expression` varchar(255) NOT NULL,
`job_description` varchar(255) NOT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`job_classname` varchar(255) NOT NULL,
`job_methodname` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
三、环境搭建成功后,进行测试
实现方案:通过前几篇对quartz的介绍,本次测试要达到的效果就是quartz与spring整合,通过随时的添加定时任务后
定时执行某一个类的方法。
1、添加定时任务
新建数据库表对应的实体类:ScheduleJob.class。在controller层写一个模拟保存的方法如下:
@RequestMapping("/save.do")
public void addJob() throws SchedulerException{
ScheduleJob job = new ScheduleJob();
job.setDescription("测试");
job.setJobClassName("com.lzt.test.MyQuertz");
job.setJobExpression("0 58 14 ? * *");
job.setJobName("lzt");
job.setJobGroup("lztGroup");
job.setJobStatus(0);
job.setMethodName("run");
System.out.println(jobService.save(job).toString());
}
在service层做定时任务的存库并添加到定时任务中,添加到定时任务的方法:
/**
* 添加任务
*
* @param scheduleJob
* @throws SchedulerException
*/
public void addjob(ScheduleJob scheduleJob) throws SchedulerException {
if (scheduleJob.getJobStatus() == 1 || scheduleJob == null) { // 状态为1不启动
return;
}
Scheduler scheduler = schedulerFactory.getScheduler();
// 通过组名和类名生成唯一的key
TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
System.out.println("trigger:"+trigger);
if (trigger == null) {
// 1、创建jobDetail实例,绑定Job实现类
// 2、指明job的名称,所在组的名称,以及绑定job类
JobDetail jobDetail = JobBuilder
.newJob(QuartzJobFactory.class)
.withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup())
.build();
//3、设置参数传递
jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);
//4、设置定时
CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule
(scheduleJob.getJobExpression());
//5、构建trigger
trigger = TriggerBuilder.newTrigger()
.withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup())
.withSchedule(scheduleBuilder)
.build();
//6、按trigger重新设置job执行
scheduler.scheduleJob(jobDetail,trigger);
} else {// 已经添加过该任务
//更新相应的定时设置
CronScheduleBuilder scheduleBuilder =
CronScheduleBuilder.cronSchedule
(scheduleJob.getJobExpression());
// 按新的cronExpression表达式重新构建trigger
trigger = trigger
.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(scheduleBuilder)
.build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
System.out.println("成功");
};
本测试中先定时的去执行QuartzJobFactory类,如下
package com.lzt.JobFactory;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.alibaba.druid.pool.vendor.SybaseExceptionSorter;
import com.lzt.entity.ScheduleJob;
public class QuartzJobFactory implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("任务成功运行:"+System.currentTimeMillis());
//ScheduleJob scheduleJob = (ScheduleJob)context.getMergedJobDataMap().get("scheduleJob");
}
}
2、测试如下
运行该项目,添加三条数据到数据库并检测定时任务是否执行,结果如下测试成功
注:在实际项目中,当服务器首次运行的时候就要查询一遍数据库把全部定时任务添加到服务中。实现该功能可以写一个监听器,
在服务器第一次运行的时候就可把数据库全部数据加入到定时任务,本测试使用的是@PostConstruct注解,该注解详情请看
项目初始运行类:
package com.lzt.test;
import java.util.List;
import javax.annotation.PostConstruct;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lzt.JobFactory.jobUtil;
import com.lzt.Service.JobService;
import com.lzt.entity.ScheduleJob;
@Component
public class InitTest {
@Autowired
private JobService jobService;
@PostConstruct
public void init() throws SchedulerException{
System.out.println("初始化!添加任务");
List<ScheduleJob> jobList = jobService.getAll();
for (ScheduleJob scheduleJob : jobList) {
System.out.println(scheduleJob.toString());
jobUtil jobutil = new jobUtil();
jobutil.addjob(scheduleJob);
}
}
}