Spring对Quartz的支持 任务调度

Spring对任务调度的支持有两种不同的形式:基于JDK Timer和基于Quartz。 
我主要说基于Quartz方面的两个例子,如下 
项目实战的说明: 
Spring通过JobDetailBean,MethodInvokingJobDetailFactoryBean实现Job的定义。后者更加实用,只需指定要运行的类,和该类中要运行的方法即可,Spring将自动生成符合Quartz要求的JobDetail。 


项目实战一 
spring 定时器 配置(通过MethodInvokingJobDetailFactoryBean) 
优点:MethodInvokingJobDetailFactoryBean,它能够将普通POJO指定为用户任务。 
(1) <bean id="job1" class="com.hxrainbow.marketing.scheduler.jobbean.Test" />  //任务 


(2) // 定义调度工作任务 
<bean id="birthdayMarketingJob" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
<property name="targetObject"> 
<ref bean="job1" /> 
</property> 
<property name="targetMethod"> 
<value>test</value> 
</property> 
</bean> 




(3) // 触发任务条件 


<!-- 生日关怀 --> 
<bean id="cronBirthdayTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
<property name="jobDetail" ref="birthdayMarketingJob"></property> 
<!-- 系统会在每分钟的0秒执行调度任务。  --> 
<property name="cronExpression"> 
<value>0 * * * * ?</value> 
</property> 
</bean> 




(4) <!--  启动调度  --> 
<bean id="startQuartz" 
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
<property name="triggers"> 
<list> 
<ref bean="cronBirthdayTrigger" /> 
</list> 
</property> 
</bean> 


以下是执行任务的类: 
public class Test { 
public void test(){ 
System.out.println("-------------测试任务-------------"); 


项目实战二 
spring 定时器 配置(通过JobDetailBean) 


(1) <bean id="springContextHolder" class="com.hxrainbow.crm.util.SpringContextHolder" /> 
//以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. 


public class SpringContextHolder implements ApplicationContextAware{ 


private static ApplicationContext applicationContext; 


/** 
* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. 
*/ 
public void setApplicationContext(ApplicationContext applicationContext) { 
SpringContextHolder.applicationContext = applicationContext; 



/** 
* 取得存储在静态变量中的ApplicationContext. 
*/ 
public static ApplicationContext getApplicationContext() { 
checkApplicationContext(); 
return applicationContext; 



/** 
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
*/ 
@SuppressWarnings("unchecked") 
public static <T> T getBean(String name) { 
checkApplicationContext(); 
return (T) applicationContext.getBean(name); 



/** 
* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. 
* 如果有多个Bean符合Class, 取出第一个. 
*/ 
@SuppressWarnings("unchecked") 
public static <T> T getBean(Class<T> clazz) { 
checkApplicationContext(); 
Map beanMaps = applicationContext.getBeansOfType(clazz); 
if (beanMaps!=null && !beanMaps.isEmpty()) { 
return (T) beanMaps.values().iterator().next(); 
} else{ 
return null; 




private static void checkApplicationContext() { 
if (applicationContext == null) { 
throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder"); 





(2) // 定义调度工作任务 
    <bean id ="birthdayMarketingJob" class 
="org.springframework.scheduling.quartz.JobDetailBean"> <property name 
="jobClass" > 
<value>com.hxrainbow.marketing.scheduler.jobbean.BirthdayMarketingJob</value 
> </property> </bean> 


(3) // 触发任务条件 


<!-- 生日关怀 --> 
<bean id="cronBirthdayTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
<property name="jobDetail" ref="birthdayMarketingJob"></property> 
<!-- 系统会在每分钟的0秒执行调度任务。  --> 
<property name="cronExpression"> 
<value>0 * * * * ?</value> 
</property> 
        <!--设置参数 --> 
<property name="jobDataAsMap"> 
<map> 
<entry key="festivalName"> 
<value>元旦</value> 
</entry> 
</map> 
</property> 
</bean> 




(4) <!--  启动调度  --> 
<bean id="startQuartz" 
class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
<property name="triggers"> 
<list> 
<ref bean="cronBirthdayTrigger" /> 
</list> 
</property> 
</bean> 


以下是执行任务的类: 
public class BirthdayMarketingJob extends QuartzJobBean{ 


static Log logger = LogFactory.getLog(BirthdayMarketingJob.class);   


/** 
* 生日关怀serivce 
*/ 
private  BirthdayMarketingService birthdayMarketingService = SpringContextHolder.getBean("birthdayMarketingService"); 


/** 
* 计划任务执行 

* @param context 
* @throws JobExecutionException 

*/ 
protected void executeInternal(JobExecutionContext context) 
throws JobExecutionException { 
logger.info("--------job 开始---------"); 
// 执行必要的业务逻辑 
//birthdayMarketingService = (BirthdayMarketingService) appcontext.getBean("birthdayMarketingService"); 


// Every job has its own job detail       
        JobDetail jobDetail = context.getJobDetail();       
    
        // The name is defined in the job definition       
        String jobName = jobDetail.getName();       
    
        // Log the time the job started       
        logger.info(jobName + "==BirthdayMarketingJob== fired at " + new Date());       
    
        // The directory to scan is stored in the job map       
        //JobDataMap dataMap = jobDetail.getJobDataMap();     
       
        //查询全体会员的生日关怀 
        TBirthday birthday = birthdayMarketingService.getBirthdayForMember(); 
        //进入生日关怀队列 
        birthdayMarketingService.intoBirthdayQueue(birthday.getId()); 
        //执行生日关怀队列 
        birthdayMarketingService.executeBirthdayQueue(birthday.getId()); 
        
        logger.info("--------job 结束---------"); 



public BirthdayMarketingService getBirthdayMarketingService() { 
return birthdayMarketingService; 



public void setBirthdayMarketingService( 
BirthdayMarketingService birthdayMarketingService) { 
this.birthdayMarketingService = birthdayMarketingService; 
}       


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值