很有用的quartz的学习资料。。。
本人最近也一值在项目是使用。。。。。
package com.chinaGPS.driverBook.service.impl;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import com.chinaGPS.driverBook.dao.ScheduleDao;
import com.chinaGPS.driverBook.pojo.ScheduleInfo;
import com.chinaGPS.driverBook.service.IQuartzTaskService;
import com.chinaGPS.driverBook.service.job.WeatherJob;
/**
* 定义任务调度
*
* @author zhz
*
*/
public class QuartzTaskService implements IQuartzTaskService {
private static final String WEATHERJOBNAME = "weatherTrigger";
private static final String WEATHERGROUP = "weatherGroup";
private static final String WEATHERTARGETMETHOD = "saveCityWeather";
private static IQuartzTaskService manager;
private Scheduler schedulerFactory;
private WeatherJob weatherJob;
private ScheduleDao scheduleDao;
private CronTriggerBean trigger;
private JobDetail weatherJobDetail;
public ScheduleDao getScheduleDao() {
return scheduleDao;
}
public void setScheduleDao(ScheduleDao scheduleDao) {
this.scheduleDao = scheduleDao;
}
public WeatherJob getWeatherJob() {
return weatherJob;
}
public void setWeatherJob(WeatherJob weatherJob) {
this.weatherJob = weatherJob;
}
public Scheduler getSchedulerFactory() {
return schedulerFactory;
}
public void setSchedulerFactory(Scheduler schedulerFactory) {
this.schedulerFactory = schedulerFactory;
}
@Override
public void reWeatherCatchScheduleJob() {
try {
// 运行时可通过动态注入的scheduler得到trigger
List<ScheduleInfo> dbCronExpressionList = getCronExpressionFromDB();
//先清除trigger
String [] triggesName = schedulerFactory.getTriggerNames(WEATHERGROUP);
for (int i = 0; i < triggesName.length; i++) {
String triggerName = triggesName[i];
schedulerFactory.unscheduleJob(triggerName, WEATHERGROUP);
}
if(schedulerFactory.getTriggerNames(WEATHERGROUP).length==0){
//然后暂停任务工厂
System.out.println("后台定时调度天气任务,重置。。。。。");
}
for (ScheduleInfo info : dbCronExpressionList) {
weatherJobDetail = new JobDetail(info.getId(), WEATHERGROUP, WeatherJob.class);
trigger = new CronTriggerBean();
trigger.setName(info.getId());
// trigger.setJobDetail(weatherJobDetail);
trigger.setGroup(WEATHERGROUP);
trigger.setCronExpression(info.getJobCronExp());
schedulerFactory.scheduleJob(weatherJobDetail,trigger);
}
schedulerFactory.startDelayed(3);
} catch (SchedulerException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
// 下面是具体的job内容,可自行设置
weatherJob.saveCityWeather();
// executeJobDetail();
}
private List<ScheduleInfo> getCronExpressionFromDB() {
return scheduleDao.findAll();
// return "0/10 * * * * ?";
}
public static void main(String[] args) {
Collection<String> files = new ArrayList<String>();
files.add("/WebContent/WEB-INF/spring/*.xml");
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(
files.toArray(new String[0]));
manager = (IQuartzTaskService) ctx.getBean("quartzTaskService");
manager.reWeatherCatchScheduleJob();
}
}
以上是编程调用。。。。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
default-autowire="byName">
<!-- 每天晚上12点调度 三个任务 -->
<bean id="sysPwdJob" class="com.chinaGPS.driverBook.service.job.SysPwdSuccessJob">
<property name="userManagerService" ref="userManagerService"></property>
</bean>
<bean id="servicePwdJob" class="com.chinaGPS.driverBook.service.job.ServicePwdFailResetJob">
<property name="userManagerService" ref="userManagerService"></property>
</bean>
<bean id="carBindJob" class="com.chinaGPS.driverBook.service.job.BindCarFailResetJob"></bean>
<!-- 天气任务 -->
<bean id="weatherJob" class="com.chinaGPS.driverBook.service.job.WeatherJob"></bean>
<!-- 定时任务开始 -->
<bean id="sysPwdJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="sysPwdJob"/>
</property>
<property name="targetMethod">
<value>resetCount</value>
</property>
</bean>
<bean id="servicePwdJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="servicePwdJob"/>
</property>
<property name="targetMethod">
<value>resetCount</value>
</property>
</bean>
<bean id="carBindJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="carBindJob"/>
</property>
<property name="targetMethod">
<value>resetCount</value>
</property>
</bean>
<!-- 天气任务 保存json任务-->
<bean id="weatherJobSaveDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="weatherJob"/>
</property>
<property name="targetMethod">
<value>saveCityWeather</value>
</property>
</bean>
<!-- 天气任务 deletejson任务-->
<!-- <bean id="weatherJobDeleteDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> -->
<!-- <property name="targetObject"> -->
<!-- <ref bean="weatherJob"/> -->
<!-- </property> -->
<!-- <property name="targetMethod"> -->
<!-- <value>saveCityWeather</value> -->
<!-- </property> -->
<!-- </bean> -->
<!-- 定义trigger -->
<bean id="sysPwdTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 -->
<property name="jobDetail">
<ref bean="sysPwdJobDetail" />
</property>
<!-- 每天凌晨12点执行一次 -->
<property name="cronExpression">
<value>0 0 0 * * ?</value>
</property>
</bean>
<bean id="servicePwdTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 -->
<property name="jobDetail">
<ref bean="servicePwdJobDetail" />
</property>
<!-- 每天凌晨12点执行一次 -->
<property name="cronExpression">
<value>0 0 0 * * ?</value>
</property>
</bean>
<bean id="carBindTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 这里不可以直接在属性jobDetail中引用taskJob,因为他要求的是一个jobDetail类型的对象,所以我们得通过MethodInvokingJobDetailFactoryBean来转一下 -->
<property name="jobDetail">
<ref bean="carBindJobDetail" />
</property>
<!-- 每天凌晨12点执行一次 -->
<property name="cronExpression">
<value>0 0 0 * * ?</value>
</property>
</bean>
<!-- 天气json定时 触发-->
<bean id="weatherTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="weatherJobSaveDetail"/>
</property>
<property name="cronExpression">
<value>0 0 0 * * ?</value>
</property>
</bean>
<!-- 触发器工厂,将所有的定时任务都注入工厂-->
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no" lazy-init="false">
<!-- 添加触发器 -->
<property name="triggers">
<list>
<!-- 将上面定义的测试定时任务注入(可以定义多个定时任务,同时注入)-->
<ref local="sysPwdTrigger" />
<ref local="servicePwdTrigger" />
<ref local="carBindTrigger" />
<ref local="weatherTrigger"/>
</list>
</property>
</bean>
<!-- 定时任务 结束 -->
<bean id="quartzTaskService" class="com.chinaGPS.driverBook.service.impl.QuartzTaskService" scope="prototype">
<property name="schedulerFactory" ref="schedulerFactory"></property>
<property name="scheduleDao" ref="scheduleDao"></property>
</bean>
</beans>
以上是spring 配置调用。。。。。。。。。。。
编程调用时,可以对某个任务设置多个触发时间任务,任务执行的规则来自数据库。。。。。。。。
xml配置就很难做到这一点。。。。。。