`
qq123zhz
  • 浏览: 525068 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

quartz 定时任务调度

 
阅读更多

 很有用的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配置就很难做到这一点。。。。。。

分享到:
评论
1 楼 分开旅行 2012-04-10  
不错,收藏之!

相关推荐

Global site tag (gtag.js) - Google Analytics