QuartZ配置开发
spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。
至于原因,则是spring对于quartz的支持实现org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。
这里使用的quartz版本是2.2.1 。
pom.xml添加quartz依赖包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
项目启动类配置web.xml
<listener>
<listener-class>com.szreachflow.app.scheduled.StartSchedulerJobListener</listener-class>
</listener>
启动类StartSchedulerJobListener.java
public class StartSchedulerJobListener implements ServletContextListener {
private static final Log log = LogFactory.getLog(StartSchedulerJobListener.class);
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 项目启动的时候执行的方法
// 这里可以放你要执行的代码或方法
//简单任务调度,每隔多少时间执行一次,执行n次
try {
SchedulerUtil.handleSimpleTrigger("企业微信消息", "企业微信消息组","企业微信消息触发器", "企业微信消息触发器组", PushJob.class, 1, -1);
} catch (Exception e) {
log.warn("SchedulerUtil.handleSimpleTrigger执行任务出现异常E:["+ e.getMessage() + "]");
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 项目消亡的时候执行的方法
}
}
定时任务公共类SchedulerUtil.java
public class SchedulerUtil {
private static final Log log = LogFactory.getLog(SchedulerUtil.class);
/**
* [简单任务调度:每次执行间隔为多少毫秒,执行多少次] <br>
* @param jobName 任务名字
* @param jobGroupName 任务组名字
* @param triggerName 触发器名字
* @param triggerGroupName 触发器组名字
* @param jobClass 任务类
* @param interval 时间间隔
* @param count 执行几次 -1(不限)<br>
*/
public static void handleSimpleTrigger(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,
int interval, int count) {
// 通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler;
try {
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName).build();
// 定义调度触发规则
//使用simpleTrigger规则
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName,
triggerGroupName)
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(interval).withRepeatCount(count))
.startNow().build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
} catch (Exception e) {
log.warn("执行"+jobName+"组"+jobName+"任务出现异常E:["+ e.getMessage() + "]");
}
}
/**
* [复杂任务调度:每天几点几分几秒定时执行任务] <br>
* @param jobName 任务名字
* @param jobGroupName 任务组名字
* @param triggerName 触发器名字
* @param triggerGroupName 触发器组名字
* @param jobClass 任务类
* @param cron 触发规则<br>
*/
public static void hadleCronTrigger(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,String cron) {
// 通过schedulerFactory获取一个调度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler;
try {
// 通过schedulerFactory获取一个调度器
scheduler = schedulerfactory.getScheduler();
// 创建jobDetail实例,绑定Job实现类
// 指明job的名称,所在组的名称,以及绑定job类
JobDetail job = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName).build();
// 定义调度触发规则
//使用cornTrigger规则 每天18点30分
Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.startNow().build();
// 把作业和触发器注册到任务调度中
scheduler.scheduleJob(job, trigger);
// 启动调度
scheduler.start();
} catch (Exception e) {
log.warn("执行"+jobName+"组"+jobName+"任务出现异常E:["+ e.getMessage() + "]");
}
}
public static void main(String[] args) {
//简单任务调度,每隔多少时间执行一次,执行n次
SchedulerUtil.handleSimpleTrigger("任务名字", "任务组名字","触发器名字", "触发器组名字", PushJob.class, 1, -1);
//复杂调度,每天的什么时候执行任务
//SchedulerUtil.hadleCronTrigger("任务名字", "任务组名字","触发器名字", "触发器组名字",PushJob.class,"0 19 19 * * ? *");
}
}
任务业务类PushJob.java
public class PushJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.print("=================PushJob start=================================");
System.out.print("=================PushJob end=================================");
}
}
正文到此结束