一、准备工作

1. 在maven的pom文件中添加Quartz的Jar坐标

  org.quartz-scheduler  quartz  2.2.1  org.quartz-scheduler  quartz-jobs  2.2.1

2. 在web.xml中添加quartz的监听器

org.quartz.ee.servlet.QuartzInitializerListener

3. 添加quartz.properties配置文件

# Configure Main Scheduler Properties
org.quartz.scheduler.instanceName: dufy_test
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

# Configure ThreadPool
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000

# Configure JobStore 持久化配置
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true

# 是否集群
org.quartz.jobStore.isClustered = false 

# 表前缀
org.quartz.jobStore.tablePrefix:qrtz_
#org.quartz.jobStore.dataSource:qzDS

# 下面是数据库的配置,交给Spring管理了
#org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver
#org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test
#org.quartz.dataSource.qzDS.user:root
#org.quartz.dataSource.qzDS.password:123
#org.quartz.dataSource.qzDS.maxConnection:10

4. 添加Spring配置:applicationContext-quartz.xml

 
     
     	
     	 
     	

5. 将Quartz自带的表导入Mysql

create table qrtz_job_details(
	sched_name varchar(120) not null,
	job_name varchar(80) not null,
	job_group varchar(80) not null,
	description varchar(120),
	job_class_name varchar(128) not null,
	is_durable integer not null,
	is_nonconcurrent integer not null,
	is_update_data integer not null,
	requests_recovery integer not null,
	job_data blob(2000),
	primary key (sched_name,job_name,job_group)
);

create table qrtz_triggers(
	sched_name varchar(120) not null,
	trigger_name varchar(80) not null,
	trigger_group varchar(80) not null,
	job_name varchar(80) not null,
	job_group varchar(80) not null,
	description varchar(120),
	next_fire_time bigint,
	prev_fire_time bigint,
	priority integer,
	trigger_state varchar(16) not null,
	trigger_type varchar(8) not null,
	start_time bigint not null,
	end_time bigint,
	calendar_name varchar(80),
	misfire_instr smallint,
	job_data blob(2000),
	primary key (sched_name,trigger_name,trigger_group),
	foreign key (sched_name,job_name,job_group) references qrtz_job_details(sched_name,job_name,job_group)
);

create table qrtz_simple_triggers(
	sched_name varchar(120) not null,
	trigger_name varchar(80) not null,
	trigger_group varchar(80) not null,
	repeat_count bigint not null,
	repeat_interval bigint not null,
	times_triggered bigint not null,
	primary key (sched_name,trigger_name,trigger_group),
	foreign key (sched_name,trigger_name,trigger_group) references qrtz_triggers(sched_name,trigger_name,trigger_group)
);

create table qrtz_cron_triggers(
	sched_name varchar(120) not null,
	trigger_name varchar(80) not null,
	trigger_group varchar(80) not null,
	cron_expression varchar(120) not null,
	time_zone_id varchar(80),
	primary key (sched_name,trigger_name,trigger_group),
	foreign key (sched_name,trigger_name,trigger_group) references qrtz_triggers(sched_name,trigger_name,trigger_group)
);

CREATE TABLE qrtz_simprop_triggers(          
    sched_name varchar(120) not null,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    STR_PROP_1 VARCHAR(512) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (sched_name,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (sched_name,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(sched_name,TRIGGER_NAME,TRIGGER_GROUP)
);

create table qrtz_blob_triggers(
	sched_name varchar(120) not null,
	trigger_name varchar(80) not null,
	trigger_group varchar(80) not null,
	blob_data blob(2000),
	primary key (sched_name,trigger_name,trigger_group),
	foreign key (sched_name,trigger_name,trigger_group) references qrtz_triggers(sched_name,trigger_name,trigger_group)
);

create table qrtz_calendars(
	sched_name varchar(120) not null,
	calendar_name varchar(80) not null,
	calendar blob(2000) not null,
	primary key (calendar_name)
);

create table qrtz_fired_triggers(
	sched_name varchar(120) not null,
	entry_id varchar(95) not null,
	trigger_name varchar(80) not null,
	trigger_group varchar(80) not null,
	instance_name varchar(80) not null,
	fired_time bigint not null,
	sched_time bigint not null,
	priority integer not null,
	state varchar(16) not null,
	job_name varchar(80),
	job_group varchar(80),
	is_nonconcurrent integer,
	requests_recovery integer,
	primary key (sched_name,entry_id)
);

create table qrtz_paused_trigger_grps(
	sched_name varchar(120) not null,
	trigger_group varchar(80) not null,
	primary key (sched_name,trigger_group)
);

create table qrtz_scheduler_state(
	sched_name varchar(120) not null,
	instance_name varchar(80) not null,
	last_checkin_time bigint not null,
	checkin_interval bigint not null,
	primary key (sched_name,instance_name)
);

create table qrtz_locks(
	sched_name varchar(120) not null,
	lock_name varchar(40) not null,
	primary key (sched_name,lock_name)
);

6. 自己建立管理定时任务的表,我简单写了几个必须的属性

public class QuartzTask {

	/*
	 * 这个类用于展示定时的任务,同时作用于定时任务的恢复、删除、中止;
	 **/

	private Long jobId;

	private String jobClass; //任务类的全限定类名

	private String jobGroup; //任务组名

	private String jobName; //任务名

	private String triggerName; //任务触发器名

	private String triggerGroupName; //任务触发器组名

	private String cronExpr; //时间表达式

	private Integer jobStatus; //任务状态
	
	private String startTime; //任务开始时间
}

7. 准备俩简单的Jsp页面用于添加定时任务和定时任务列表展示

Quartz简单实现定时任务管理(SSM+Quartz)_Quartz

   大致效果如下:

Quartz简单实现定时任务管理(SSM+Quartz)_Quartz_02

Quartz简单实现定时任务管理(SSM+Quartz)_Quartz_03

二、简单代码实现

1.写个任务类,本想做个功能,失败了,就简单控制台输出了

public class MyJob implements Job{

	private static final Logger log = LoggerFactory.getLogger(MyJob.class);
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		
		log.info("MyJob  is start .................."); 
		
		log.info("Hello quzrtz  "+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
		
		log.info("MyJob  is end .....................");
				
	}	
}

2. Controller层:QuartzController

@Controller
@RequestMapping("user/quartz")
public class QuartzController {
	
	@Autowired
    private QuartzTaskService quartzTaskService;
	
	/**
	 *  添加定时任务
	 * */
	@RequestMapping(value = "add",method = RequestMethod.POST)
	public ModelAndView addQtz(QuartzTask qt){
		
		try {
			//1.成功启动定时任务
			this.quartzTaskService.addQtz(qt);	

			//2.封装QuartzTask,执行保存
			this.quartzTaskService.saveAddQtz(qt);
			
			return new ModelAndView("success");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("error");
			
	}
	
	/**
	 *  定时任务列表
	 * */
	@RequestMapping(value = "list",method = RequestMethod.GET)
	public ModelAndView listQtz(){
		
		try {
			//1.查询所有定时任务
			Listlist = this.quartzTaskService.listQtz();	
			ModelAndView mv = new ModelAndView();
			mv.addObject("qtzList",list);
			mv.setViewName("quartz-list");
			
			return mv;

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("error");
			
	}
	
	/**
	 *  删除定时任务
	 * */
	@RequestMapping(value = "delete",method = RequestMethod.GET)
	public ModelAndView deleteQtz(QuartzTask qt){
		
		try {
			// 执行删除
			this.quartzTaskService.deleteQtz(qt);
			
			// 根据id删除定时任务列表数据
			this.quartzTaskService.deleteQtzTask(qt.getJobId());
			
			return new ModelAndView("success");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("error");
			
	}
	
	/**
	 *  中止定时任务
	 * */
	@RequestMapping(value = "pause",method = RequestMethod.GET)
	public ModelAndView pauseQtz(QuartzTask qt){
		
		try {
			// 执行中止
			this.quartzTaskService.pauseQtz(qt);
			
			return new ModelAndView("success");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("error");
			
	}
	
	/**
	 *  恢复定时任务
	 * */
	@RequestMapping(value = "resume",method = RequestMethod.GET)
	public ModelAndView resumeQtz(QuartzTask qt){
		
		try {
			// 执行中止
			this.quartzTaskService.resumeQtz(qt);
			
			return new ModelAndView("success");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return new ModelAndView("error");
			
	}
}

3. Service层:QuartzTaskServiceImpl

@Service
public class QuartzTaskServiceImpl implements QuartzTaskService {

	@Autowired
	private QuartzDao quartzDao;

	@Autowired
	private Scheduler scheduler;

	@Override
	public void addQtz(QuartzTask qt) {

		try {
			// 1.创建一个JobDetail实例,指定Quartz
			String cla = qt.getJobClass();
			Class clazz = Class.forName(cla);
			JobDetail jobDetail = JobBuilder.newJob(clazz) // 任务执行类
					.withIdentity(qt.getJobName(), qt.getJobGroup())// 任务名,任务组
					.build();
			CronScheduleBuilder builder = CronScheduleBuilder.cronSchedule(qt.getCronExpr());

			// 2.创建Trigger(触发器)
			Trigger trigger = TriggerBuilder.newTrigger().withIdentity(qt.getTriggerName(), qt.getTriggerGroupName())
					.startNow().withSchedule(builder).build();

			// 3.告诉调度器使用该触发器来安排作业
			scheduler.scheduleJob(jobDetail, trigger);

			// 4.启动
			if (!scheduler.isShutdown()) {
			  scheduler.start();
			}

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public void saveAddQtz(QuartzTask qt) {

		qt.setJobId(1l);
		qt.setJobStatus(1);
		qt.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));

		this.quartzDao.saveAddQtz(qt);

	}

	@Override
	public ListlistQtz() {

		return quartzDao.listQtz();
	}

	@Override
	public void deleteQtz(QuartzTask qt) {

		try {
			// 停止触发器
			scheduler.pauseTrigger(TriggerKey.triggerKey(qt.getTriggerName(), qt.getTriggerGroupName()));
			// 移除触发器
			scheduler.unscheduleJob(TriggerKey.triggerKey(qt.getTriggerName(), qt.getTriggerGroupName()));
			// 删除任务
			scheduler.deleteJob(JobKey.jobKey(qt.getJobName(), qt.getJobGroup()));
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public void deleteQtzTask(Long jobId) {

		this.quartzDao.deleteQtzTask(jobId);

	}

	@Override
	public void pauseQtz(QuartzTask qt) {

		try {
			scheduler.pauseJob(JobKey.jobKey(qt.getJobName(), qt.getJobGroup()));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

	}

	@Override
	public void resumeQtz(QuartzTask qt) {

		try {
			scheduler.resumeJob(JobKey.jobKey(qt.getJobName(), qt.getJobGroup()));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

	}

}

4. 与数据库交互的QuartzTask.xml文件




	
		
		
		
		
		
		
		
		
		
	
	
	
	
		INSERT INTO quartz
		(job_id,job_class,job_group,job_name,trigger_name,trigger_groupName,cron_expr,job_status,start_time)
		VALUES(#{jobId},#{jobClass},#{jobGroup},#{jobName},#{triggerName},#{triggerGroupName},#{cronExpr},#{jobStatus},#{startTime});	
	
	  
		select * from quartz;	
	
	
		DELETE from quartz where job_id = #{jobId};	
	

  我这里只做了简单实现,还有很多地方不懂,继续努力。