`

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;
}      

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics