Quartz定时任务调度详细实现案例

原创 2015年11月18日 15:49:42

什么也不说直接上代码,代码的注释中有相关的讲解。

1、代码结构中用到的一些Jar包:

log4j-1.2.16.jar
quartz-2.2.1.jar
quartz-jobs-2.2.1.jar
slf4j-api-1.6.6.jar
slf4j-log4j12-1.6.6.jar

2、获取Scheduler对象:

package com.pitelin.quartz;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

/**
 * 构建Scheduler工厂
 * @author liZhongLin
 *
 */
public class QuartzSchedulerFactory {

	/**
	 * 定义静态Scheduler工厂
	 */
	private static SchedulerFactory schedulerFactory;

	/**
	 * 执行静态代码块
	 */
	static {
		schedulerFactory = new StdSchedulerFactory();
	}

	/**
	 * 返回一个Scheduler对象
	 * @return Scheduler
	 */
	public static Scheduler getInstance() {
		try {
			return QuartzSchedulerFactory.schedulerFactory.getScheduler();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return null;
	}

}

3、获取CronTrigger对象:

package com.pitelin.quartz;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.CronTrigger;
import com.pitelin.quartz.entity.QuartzParamsEntity;

/**
 * 根据给定的参数,获取CronTrigger
 * @author liZhongLin
 *
 */
public class QuartzCronTrigger {

	/**
	 * 根据给定的参数,获取CronTrigger
	 * @param paramsEntity
	 * @return CronTrigger
	 */
	public static CronTrigger getCronTrigger(QuartzParamsEntity paramsEntity) {

		String trigger = paramsEntity.getTriggerName();
		String group = paramsEntity.getGroupName();
		String cronExpression = paramsEntity.getCronExpression();

		return newTrigger().withIdentity(trigger, group).withSchedule(cronSchedule(cronExpression)).build();
	}
}

4、获取JobDetail对象:

package com.pitelin.quartz;

import static org.quartz.JobBuilder.newJob;

import org.quartz.JobDetail;

import com.pitelin.quartz.entity.QuartzParamsEntity;

/**
 * 根据给定的参数获取JobDetail对象
 * @author liZhongLin
 *
 */
public class QuartzJobDetail {

	/**
	 * 根据给定的参数获取JobDetail对象
	 * @param paramsEntity
	 * @return JobDetail
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static JobDetail getJobDetail(QuartzParamsEntity paramsEntity) {
		
		Class jobClass = paramsEntity.getJobClass();
		String jobName = paramsEntity.getJobName();
		String groupName = paramsEntity.getGroupName();

		return newJob(jobClass).withIdentity(jobName, groupName).build();
	}
}

5、启动和关闭Job线程:

package com.pitelin.quartz;

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;

import com.pitelin.quartz.entity.QuartzParamsEntity;

/**
 * 
 * 1、Job表示一个工作,要执行的具体内容。此接口中只有一个方法:void execute(JobExecutionContext context)
 * 2、JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
 * 3、Trigger代表一个调度参数的配置,什么时候去调用。
 * 4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
 * 
 * @author liZhongLin
 *
 */
public class QuartzJobStart {

	/**
	 * 定义静态Scheduler
	 */
	private static Scheduler sched; 
	
	/**
	 * 执行静态代码块
	 */
	static{
		sched = QuartzSchedulerFactory.getInstance();
	}
	
	/**
	 * Job线程启动操作
	 * @param paramsEntity
	 * @throws SchedulerException
	 */
	public static void start(QuartzParamsEntity paramsEntity) throws SchedulerException { 

        JobDetail job = QuartzJobDetail.getJobDetail(paramsEntity);

		CronTrigger trigger = QuartzCronTrigger.getCronTrigger(paramsEntity);

		sched.scheduleJob(job, trigger);

		sched.start();
	}
	
	/**
	 * Job线程关闭操作
	 * @throws SchedulerException
	 */
	public static void stop() throws SchedulerException {
		sched.shutdown(true);
	}
}
6、定义一个Job参数实体:

package com.pitelin.quartz.entity;

/**
 * 定时任务参数实体
 * @author liZhongLin
 *
 */
public class QuartzParamsEntity {

	/**
	 * 执行定时任务的class <? extends Job>
	 */
	private Class<?> jobClass;
	/**
	 * trigger名称
	 */
	private String triggerName;
	/**
	 * job名称
	 */
	private String jobName;
	/**
	 * group名称
	 */
	private String groupName;
	/**
	 * 定时任务表达式
	 */
	private String cronExpression;
		
}

这里的get和set方法由于篇幅原因,已经删除,想要运行程序的话,补上就可以了。

7、编写两个简单的Job:

第一个JOB:

package com.pitelin.quartz.job;

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;

/**
 * 
 * 生成一个当前时间的JOB
 * @author liZhongLin
 *
 */
public class DateJob implements Job{
	
	/**
	 * 日志信息
	 */
	private final Logger log = LoggerFactory.getLogger(DateJob.class);

	/**
	 * 获取当前的时间
	 */
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		log.debug("现在的时间为:" + sdf.format(new Date()));
	}
}

第二个JOB:

package com.pitelin.quartz.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 生成一个1-100的随机数的JOB
 * @author liZhongLin
 *
 */
public class RandomJob implements Job {

	/**
	 * 日志信息
	 */
	private final Logger log = LoggerFactory.getLogger(RandomJob.class);
	
	/**
	 * 生成一个1-100的随机数
	 */
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		int random = (int)(Math.random()*100);
		log.debug("生成的随机数为:" + random);
	}
}


8、测试Job:

package com.pitelin.quartz.test;

import com.pitelin.quartz.QuartzJobStart;
import com.pitelin.quartz.entity.QuartzParamsEntity;
import com.pitelin.quartz.job.DateJob;
import com.pitelin.quartz.job.RandomJob;

/**
 * 任务调度测试类
 * @author liZhongLin
 *
 */
public class QuartzJobTest {

	/**
	 * 主方法
	 * 这里的输入参数使用了硬编码的方式,最合理的方式是可以把这些参数存放到数据库当中。
	 * 之后根据查询的结果赋给List<QuartzParamsEntity>,并循环执行任务调度
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {		
		
		QuartzParamsEntity paramsEntityOne = new QuartzParamsEntity();
		paramsEntityOne.setJobClass(DateJob.class);
		paramsEntityOne.setJobName("myJobOne");
		paramsEntityOne.setGroupName("myGroup");
		paramsEntityOne.setTriggerName("myTriggerOne");
		paramsEntityOne.setCronExpression("0/1 * * * * ?");//每个一秒执行一次
		
		QuartzParamsEntity paramsEntityTwo = new QuartzParamsEntity();
		paramsEntityTwo.setJobClass(RandomJob.class);
		paramsEntityTwo.setJobName("myJobTwo");
		paramsEntityTwo.setGroupName("myGroup");
		paramsEntityTwo.setTriggerName("myTriggerTwo");
		paramsEntityTwo.setCronExpression("0/2 * * * * ?");//每个两秒执行一次
		
		QuartzJobStart.start(paramsEntityOne);
		QuartzJobStart.start(paramsEntityTwo);
		
		Thread.sleep(6000);//线程休眠六秒时间
		
		QuartzJobStart.stop();
	}
}

9:、附上log4j.properties资源文件配置:

log4j.rootLogger =ALL,systemOut

#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = %-22d{yyyy-MM-dd HH:mm:ss}[%-5p][%l]%m%n
log4j.appender.systemOut.Threshold = DEBUG
log4j.appender.systemOut.ImmediateFlush = TRUE
log4j.appender.systemOut.Target = System.out


quartz简单定时任务示例

测试jar版本:quartz-1.6.0.jar Job类: import java.util.Date; import org.quartz.Job; import org.quartz.Job...
  • zhangbest2009
  • zhangbest2009
  • 2015年12月03日 20:13
  • 586

Quartz任务调度(4)JobListener分版本超详细解析

在《spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验》我们通过实例分析讲解了spring的事件机制,或许你会觉得其中的配置略显繁琐,而在Quartz框架中,它...
  • qwe6112071
  • qwe6112071
  • 2016年03月27日 14:09
  • 4184

quartz监控日志(二)添加监听器

上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener。 上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监...
  • lp19861126
  • lp19861126
  • 2017年04月17日 15:05
  • 567

任务调度框架Quartz,Log4Net记录日志

using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste...
  • HCW881007
  • HCW881007
  • 2013年03月15日 23:18
  • 2575

解决Spring定时计划任务重复执行两次或多次(实例被构造两次)问题的方法

原文:http://blog.csdn.net/chaijunkun/article/details/6925889 今天在做一个项目的时候用到了Spring的定时计划任务。...
  • jiang117
  • jiang117
  • 2015年01月24日 01:38
  • 3181

ssm(spring+springMVC+Mybatis)框架 集成Quartz(定时任务框架)

1、ssm框架基础jar 包 aopalliance.jar aspectjrt.jar aspectjweaver.jar commons-beanutils-1.9.2.jar commons-...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2016年05月18日 22:00
  • 5427

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享

java计划任务调度框架quartz结合spring实现调度的配置实例代码分享,代码下载地址:http://www.zuidaima.com/share/1755429240540160.htm...
  • yaerfeng
  • yaerfeng
  • 2014年04月26日 10:03
  • 12174

定时任务调度之Quartz----入门小案例

代码: package com.haige.job; import java.text.SimpleDateFormat; import java.util.Date; import org.qu...
  • linhaiyun_ytdx
  • linhaiyun_ytdx
  • 2017年11月03日 19:49
  • 73

windows 服务实现定时任务调度(Quartz.Net)

  • 2017年12月27日 13:23
  • 796KB
  • 下载

ASP.NET使用Quartz.NET实现定时任务调度

  • 2017年08月03日 12:38
  • 9.88MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quartz定时任务调度详细实现案例
举报原因:
原因补充:

(最多只允许输入30个字)