`
clq9761
  • 浏览: 592711 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

Spring quartz任务调度

阅读更多

Quartz 是一个 Java 轻量级开源企业级的作业调度框架,官网地址为: http://quartz-scheduler.org/

一. Quartz静态配置

1.配置applicationContext-quartz.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans> 	
	<!--Spring quartz 服务器启动会自动执行,在web.xml文件中加载-->	
	<bean id="logJob1"
        class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass">
            <value>com.icsshs.mp.common.quartz.LogJob</value>
        </property>
        <property name="jobDataAsMap">
            <map>
                <entry key="timeout">
                    <value>10</value>
                </entry>
            </map>
        </property>
    </bean>
    
    <bean id="personDataJobDetail" 
    	  class="org.springframework.scheduling.quartz.JobDetailBean">
 		<property name="jobClass">
 			<value>com.icsshs.mp.common.quartz.MyJobBean</value>
		</property>
 	</bean>       
    
    <!-- SimpleTriggerBean只能指定工作执行的频率,不能指定工作执行的具体时间,单位为ms-->
    <bean id="simpleTrigger"
        class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail">
            <ref bean="logJob1"></ref>
        </property>
        <property name="startDelay">
            <value>6000</value>
        </property>
        <property name="repeatInterval">
            <value>1000</value>
        </property>
        <property name="repeatCount">
            <value>3</value>
        </property>
    </bean>    
    <!--
    cron表达式:
		 秒  0-59  , - * / 
		分  0-59  , - * / 
		小时  0-23  , - * / 
		日  1-31  , - * ? / L W C 
		月  1-12 or JAN-DEC  , - * / 
		周几  1-7 or SUN-SAT  , - * ? / L C # 
		年 (可选字段)  empty, 1970-2099  , - * / 
		1.* 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。 
		2./ 字符用来指定一个值的的增加幅度.比如在“秒”字段中设置为"0/15"表示"第0,15,30,和 45秒"。  
    -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    	<property name="jobDetail" ref="personDataJobDetail"/>
    	<property name="cronExpression" value="0/5 * * * * ?"/>
 	</bean>	

    <bean id="schedulerFactory"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">      
         <property name="triggers">
            <list>
                <ref local="simpleTrigger" />
                <ref local="cronTrigger" />
            </list>
        </property>       
    </bean>  	
</beans>

  2.定义自己的QuartzJobBean,从QuartzJobBean类继承实现。

public class LogJob extends QuartzJobBean {
	private int timeout;
    public int getTimeout(){
        return timeout;
    }    
    public void setTimeout(int timeout){
        this.timeout = timeout;
    }
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {    	
        System.out.println("quartz do......");        
    }
}

 

二. Quartz动态配置调度任务时间


1.需要构建Quartz数据库表,建表脚本在Quartz发行包的docs\dbTables目录下,
      根据所使用的数据库选择不同的初始化数据脚本,例:tables_oracle.sql。
     下载地址:http://www.quartz-scheduler.org/download/download-catalog.html

 

2.创建SchedulerService 类

public interface SchedulerService {    
    /**   
 * 根据 Quartz Cron Expression 调试任务   
 * @param cronExpression  Quartz Cron 表达式,如 "0/10 * * ? * * *"等   
 */   
void schedule(String cronExpression);    
    
/**   
 * 根据 Quartz Cron Expression 调试任务   
 * @param name  Quartz CronTrigger名称   
 * @param cronExpression Quartz Cron 表达式,如 "0/10 * * ? * * *"等   
 */   
void schedule(String name,String cronExpression);    
    
/**   
 * 根据 Quartz Cron Expression 调试任务   
 * @param cronExpression Quartz CronExpression   
 */   
void schedule(CronExpression cronExpression);    
    
/**   
 * 根据 Quartz Cron Expression 调试任务   
     * @param name Quartz CronTrigger名称   
     * @param cronExpression Quartz CronExpression   
     */   
void schedule(String name,CronExpression cronExpression);    
    
/**   
 * 在startTime时执行调试一次   
     * @param startTime 调度开始时间   
     */   
void schedule(Date startTime);      
    
/**   
 * 在startTime时执行调试一次   
 * @param name Quartz SimpleTrigger 名称   
 * @param startTime 调度开始时间   
 */   
void schedule(String name,Date startTime);    
    
/**   
 * 在startTime时执行调试,endTime结束执行调度   
 * @param startTime 调度开始时间   
 * @param endTime 调度结束时间   
 */   
void schedule(Date startTime,Date endTime);     
    
/**   
     * 在startTime时执行调试,endTime结束执行调度   
     * @param name Quartz SimpleTrigger 名称   
     * @param startTime 调度开始时间   
     * @param endTime 调度结束时间   
     */   
void schedule(String name,Date startTime,Date endTime);    
    
/**   
 * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次   
 * @param startTime 调度开始时间   
 * @param endTime 调度结束时间   
 * @param repeatCount 重复执行次数   
 */   
void schedule(Date startTime,Date endTime,int repeatCount);     
    
/**   
 * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次   
 * @param name Quartz SimpleTrigger 名称   
 * @param startTime 调度开始时间   
 * @param endTime 调度结束时间   
 * @param repeatCount 重复执行次数   
 */   
void schedule(String name,Date startTime,Date endTime,int repeatCount);    
    
/**   
 * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,
 * 每隔repeatInterval秒执行一次   
 * @param startTime 调度开始时间   
 * @param endTime 调度结束时间   
 * @param repeatCount 重复执行次数   
 * @param repeatInterval 执行时间隔间   
 */   
void schedule(Date startTime,Date endTime,int repeatCount,long repeatInterval) ;    
    
/**   
 * 在startTime时执行调试,endTime结束执行调度,重复执行repeatCount次,
 * 每隔repeatInterval秒执行一次   
 * @param name Quartz SimpleTrigger 名称   
 * @param startTime 调度开始时间   
 * @param endTime 调度结束时间   
 * @param repeatCount 重复执行次数   
 * @param repeatInterval 执行时间隔间   
 */   
void schedule(String name,Date startTime,Date endTime,int repeatCount,long repeatInterval); 

 3.动态调度服务实现类SchedulerServiceImpl

import java.text.ParseException;
import java.util.Date;
import java.util.UUID;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

@Service("schedulerService")
public class SchedulerServiceImpl implements SchedulerService {

	private Scheduler scheduler;
	private JobDetail jobDetail;
	@Autowired
	public void setJobDetail(@Qualifier("jobDetail") JobDetail jobDetail) {
		this.jobDetail = jobDetail;
	}
	@Autowired
	public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {
		this.scheduler = scheduler;
	}
	@Override
	public void schedule(String cronExpression) {
		schedule(null, cronExpression);
	}
	@Override
	public void schedule(String name, String cronExpression) {
		try {
			schedule(name, new CronExpression(cronExpression));
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
	}
	@Override
	public void schedule(CronExpression cronExpression) {
		schedule(null, cronExpression);
	}
	@Override
	public void schedule(String name, CronExpression cronExpression) {
		if (name == null || name.trim().equals("")) {
			name = UUID.randomUUID().toString();
		}
		try {
			scheduler.addJob(jobDetail, true);
			CronTrigger cronTrigger = new CronTrigger(name, 
									Scheduler.DEFAULT_GROUP,
									jobDetail.getName(),
									Scheduler.DEFAULT_GROUP);
			cronTrigger.setCronExpression(cronExpression);
			scheduler.scheduleJob(cronTrigger);
			scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);
		} catch (SchedulerException e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public void schedule(Date startTime) {
		schedule(startTime, null);
	}
	@Override
	public void schedule(String name, Date startTime) {
		schedule(name, startTime, null);
	}
	@Override
	public void schedule(Date startTime, Date endTime) {
		schedule(startTime, endTime, 0);
	}
	@Override
	public void schedule(String name, Date startTime, Date endTime) {
		schedule(name, startTime, endTime, 0);
	}
	@Override
	public void schedule(Date startTime, Date endTime, int repeatCount) {
		schedule(null, startTime, endTime, 0);
	}
	@Override
	public void schedule(String name, Date startTime, 
						Date endTime, int repeatCount) {
		schedule(name, startTime, endTime, 0, 0L);
	}
	@Override
	public void schedule(Date startTime, Date endTime, 
						int repeatCount, long repeatInterval) {
		schedule(null, startTime, endTime, repeatCount, repeatInterval);
	}
	@Override
	public void schedule(String name, Date startTime, Date endTime, 
						int repeatCount, long repeatInterval) {
		if (name == null || name.trim().equals("")) {
			name = UUID.randomUUID().toString();
		}
		try {
			scheduler.addJob(jobDetail, true);
			SimpleTrigger SimpleTrigger = new SimpleTrigger(name, 
						Scheduler.DEFAULT_GROUP, jobDetail.getName(),
						Scheduler.DEFAULT_GROUP, startTime, 
						endTime, repeatCount, repeatInterval);
			scheduler.scheduleJob(SimpleTrigger);
			scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, SimpleTrigger);
		} catch (SchedulerException e) {
			throw new RuntimeException(e);
		}
	}
}

 SchedulerService 只有一个多态方法schedule,SchedulerServiceImpl类
 实现SchedulerService接口,注入org.quartz.Schedulert和org.quartz.JobDetail,
 schedule方法可以动态配置org.quartz.CronExpression或org.quartz.SimpleTrigger调度时间。

 

4.实现自己的org.quartz.JobDetail

 

需要使用org.springframework.scheduling.quartz.JobDetailBean
和org.springframework.scheduling.quartz.QuartzJobBean实现自己的QuartzJobBean。

import org.quartz.JobExecutionContext;    
import org.quartz.JobExecutionException;    
import org.quartz.Trigger;    
import org.springframework.scheduling.quartz.QuartzJobBean;    
   
public class MyQuartzJobBean extends QuartzJobBean {      
    private SimpleService simpleService;            
    public void setSimpleService(SimpleService simpleService) {    
        this.simpleService = simpleService;    
    }   
    @Override   
    protected void executeInternal(JobExecutionContext jobexecutioncontext) 
    				throws JobExecutionException {    
        Trigger trigger = jobexecutioncontext.getTrigger();    
        String triggerName = trigger.getName();         
        simpleService.testMethod(triggerName);    
    }       
}

 

MyQuartzJobBean继承org.springframework.scheduling.quartz.QuartzJobBean,
注入的SimpleService如下:  

import java.io.Serializable;     
import org.slf4j.Logger;    
import org.slf4j.LoggerFactory;    
import org.springframework.stereotype.Service;    
   
@Service("simpleService")    
public class SimpleService implements Serializable{    
        
    private static final long serialVersionUID = 122323233244334343L;    
    private static final Logger logger = 
    					LoggerFactory.getLogger(SimpleService.class);  
        
    public void testMethod(String triggerName){    
        //这里执行定时调度业务    
        logger.info(triggerName);    
    }   
    public void testMethod2(){    
        logger.info("testMethod2");    
    }    
}

 

5 .配置applicationContext-quartz.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" 
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"> 
<beans> 
	<bean name="quartzScheduler" 
		  class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
		<property name="dataSource">  
			<ref bean="dataSource" />  
		</property> 
		<property name="applicationContextSchedulerContextKey"  
			  	  value="applicationContextKey" /> 
		<property name="configLocation" value="classpath:quartz.properties"/> 
	</bean> 
	
	<bean id="jobDetail" 
		class="org.springframework.scheduling.quartz.JobDetailBean"> 
		<property name="jobClass"> 
			<value>com.example.service.MyQuartzJobBean</value> 
		</property> 	
		<property name="jobDataAsMap"> 
		<map> 
			<entry key="simpleService"> 
			<ref bean="simpleService" /> 
			</entry> 
		</map> 
		</property> 
	</bean> 
</beans>

 

相关说明:
dataSource:项目中用到的数据源,里面包含了quartz用到的数据库表;
applicationContextSchedulerContextKey: 是org.springframework.scheduling.quartz.
   SchedulerFactoryBean这个类中把spring上下文以key/value的方式存放在了quartz的上下文中了,
   可以用applicationContextSchedulerContextKey所定义的key得到对应的spring上下文;
configLocation:用于指明quartz的配置文件的位置,如果不用spring配置quartz的话,
  本身quartz是通过一个配置文件进行配置的,默认名称是quartz.properties,
  里面配置的参数在quartz的doc文档中都有介绍,可以调整quartz,代码如下:

org.quartz.scheduler.instanceName = DefaultQuartzScheduler 
org.quartz.scheduler.rmi.export = false 
org.quartz.scheduler.rmi.proxy = false 
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false 

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 10 
org.quartz.threadPool.threadPriority = 5 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 

org.quartz.jobStore.misfireThreshold = 60000 

#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.HSQLDBDelegate 
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
#org.quartz.jobStore.useProperties = true 
org.quartz.jobStore.tablePrefix = QRTZ_  
org.quartz.jobStore.isClustered = false  
org.quartz.jobStore.maxMisfiresToHandleAtATime=1 

 

这里面没有数据源相关的配置部分,采用spring注入datasource的方式已经进行了配置。

 

6.测试 ,运行如下测试类

import java.text.ParseException;    
import java.text.SimpleDateFormat;    
import java.util.Date;     
import org.springframework.context.ApplicationContext;    
import org.springframework.context.support.ClassPathXmlApplicationContext;    
   
public class MainTest { 
   
    public static void main(String[] args) {    
        ApplicationContext springContext = new ClassPathXmlApplicationContext
        (new String[]{"classpath:applicationContext.xml",
        			  "classpath:applicationContext-quartz.xml"});    
        SchedulerService schedulerService = (SchedulerService)
        				springContext.getBean("schedulerService");    
            
        //执行业务逻辑...                
        //设置调度任务    
        //每10秒中执行调试一次    
        schedulerService.schedule("0/10 * * ? * * *");     
            
        Date startTime = parse("2009-06-01 22:16:00");    
        Date endTime =  parse("2009-06-01 22:20:00");    
            
        //2009-06-01 21:50:00开始执行调度    
        schedulerService.schedule(startTime);    
   
        //2009-06-01 21:50:00开始执行调度,2009-06-01 21:55:00结束执行调试    
        //schedulerService.schedule(startTime,endTime);    
            
        //2009-06-01 21:50:00开始执行调度,执行5次结束    
        //schedulerService.schedule(startTime,null,5);    
   
        //2009-06-01 21:50:00开始执行调度,每隔20秒执行一次,执行5次结束    
        //schedulerService.schedule(startTime,null,5,20); 
                
    }    
        
    private static Date parse(String dateStr){    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
        try {    
            return format.parse(dateStr);    
        } catch (ParseException e) {    
            throw new RuntimeException(e);    
        }    
    }    
}  

 

分享到:
评论
1 楼 pangchaofu 2011-08-31  
例子很详细,先收下了。

相关推荐

    spring quartz 任务调度

    Spring框架作为一个全面的企业级应用开发解决方案,提供了强大的任务调度支持,而Quartz则是一个流行的开源作业调度库,能够与Spring很好地集成。现在,我们就来深入探讨"spring quartz 任务调度"这一主题。 首先,...

    Spring Quartz 任务调度

    **Spring Quartz 任务调度** Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的...

    Spring Quartz 任务调度实例

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...

    spring quartz任务调度完整可执行

    在Spring的配置文件(如applicationContext.xml)中,我们需要配置SchedulerFactoryBean来启动Quartz调度器: ```xml &lt;bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean...

    spring任务调度(Quartz )

    3. **调度器配置**:`SchedulerFactoryBean`是Spring对Quartz调度器的包装,它管理所有的触发器和任务。在这里,我们将`cron`触发器添加到调度器中,使得任务与触发器关联起来。 接下来,我们看下服务类和服务的...

    Spring整合任务调度框架Quartz

    Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...

    spring+mybatis+quartz任务调度实例和spring+quartz任务调度实例

    里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例

    Spring+Quartz实现任务调度的小例子

    Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...

    spring+quartz任务调度代码版

    本项目"spring+quartz任务调度代码版"显然是一个结合了这两者的实践案例,旨在展示如何在Spring环境下集成和使用Quartz进行任务调度。 Spring框架是一个开源的应用框架,它提供了丰富的功能,包括依赖注入、AOP...

    Spring quartz定时调度jar包

    通过这种方式,Spring会自动启动Quartz调度器,并根据配置的触发器执行相应的任务。你还可以使用`@Scheduled`注解在方法级别定义定时任务,这是一种更简单的调度方式,适用于简单的场景。 总之,Spring Quartz定时...

    spring 任务调度

    - **Quartz简介**:Quartz是一个开源的作业调度框架,支持复杂的调度策略,如按日期、时间间隔或CRON表达式调度任务。 - **Spring与Quartz集成**:Spring通过`org.springframework.scheduling.quartz`包提供了一种...

    基于Spring Boot的Quartz任务调度系统.zip

    基于Spring Boot的Quartz任务调度系统 项目概述 本项目是一个基于Spring Boot和Quartz的任务调度系统,旨在提供灵活的任务管理和调度功能。系统支持多种任务类型,包括Cron表达式任务和单次时间任务,并提供了丰富...

    Spring quartz 定时任务调度

    Spring Quartz 是一个强大的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Spring框架中集成Quartz,可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming...

    Quartz任务调度器

    总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的管理,而无需关心任务执行的具体细节。它为开发者提供了一套强大的工具,帮助我们在项目中实现定时任务的自动化,提高系统的运行...

    SpringQuartz的使用文档

    SpringQuartz是一个强大的任务调度框架,它在Java应用程序中用于自动化执行特定任务,如定时生成文件、统计数据或执行后台清理工作。Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时...

    spring集成quartz 任务调度

    Spring集成Quartz是一款高效的任务调度框架,用于在Java应用程序中执行计划、周期性的任务。Quartz与Spring的结合,使得我们可以充分利用Spring的依赖注入(DI)和AOP特性,简化了任务调度的复杂性。 首先,Quartz...

    Spring实现任务调度

    本篇将深入探讨如何利用Spring进行任务调度,并结合代码演示和Quartz库的使用来丰富这一主题。 首先,Spring提供了两种主要的任务调度机制:Spring内置的`TaskExecution`和`TaskScheduling`以及与Quartz Scheduler...

    spring整合quartz定时任务调度

    Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...

    spring quartz定时任务demo

    在实际使用中,你需要在`applicationContext.xml`中配置SchedulerFactoryBean,通过它来创建和管理Quartz调度器。然后,定义你的Job Bean,并关联Trigger,告诉Quartz何时何地执行这个任务。例如: ```xml ...

Global site tag (gtag.js) - Google Analytics