Spring对Quartz的支持 任务调度

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

项目实战一
spring 定时器 配置(通过MethodInvokingJobDetailFactoryBean)
[color=red]优点:MethodInvokingJobDetailFactoryBean,它能够将普通POJO指定为用户任务。[/color]
(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;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值