场景
当门户网站上一条信息需要在5月1日的下午2点更新到网站上,我们就要以在前台页面上对某一条信息手动设置它的发布日期,spring 会将这条信息添加调度任务中,到了发布时间spring 会调用设置好的静态化业务逻辑。
代码:
向spring 任务列表添加任务
public void schedulerJob(String jobId,String jobName,Data time,Map<String,Object> params)
{
final JobDetailBean jobDetail = new JobDetailBean();
//在调度任务中全局唯一
jobDetail.setName(jobId);
jobDetail.setGroup(jobName);
//Job.class 处理业务逻辑
jobDetail.setJobClass(Job.class);
final JobDataMap dataMap = new JobDataMap();
//向调度任务传入业务参数
dataMap.put("params", params);
jobDetail.setJobDataMap(dataMap);
final SchedulerFactoryBean schedulerFactory = SpringContextUtil
.getBean(SchedulerFactoryBean.class);
final Scheduler scheduler = schedulerFactory.getScheduler();
final SimpleTrigger trigger = new SimpleTrigger();
//设置调度任务的开始时间
trigger.setStartTime(time);
trigger.setName(jobId);
trigger.setGroup(jobName);
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (final Exception e) {
e.printStackTrace();
throw new CoreRuntimeException("调度任务失败!");
}
}
开始调度
package com.bankcomm.gweb.gcms.biz.d2s.job.executor.impl;
import java.util.Map;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import com.bankcomm.gweb.biz.util.SpringContextUtil;
import com.bankcomm.gweb.gcms.biz.d2s.job.executor.ID2sJobExecutorBiz;
import com.bankcomm.gweb.gcms.condition.d2s.job.item.CmsD2sItemCondition;
/**
* @Title: Job.java
* @Package: com.bankcomm.gweb.gcms.biz.d2s.job.executor.impl
* @Description:
* @author: zhaozb.sdc@sdc.com
* @date: 2014-3-5 @ @version: V1.0
*/
@Component
public class Job extends QuartzJobBean {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private ID2sJobExecutorBiz jobExecutorBiz;
@Override
protected void executeInternal(final JobExecutionContext jobexecutioncontext)
throws JobExecutionException {
log.debug("--------------start scheduler job--------------");
final Map dataMap = jobexecutioncontext.getJobDetail().getJobDataMap();
final Map<String,Object> parmas = (Map<String,Object>) dataMap
.get("params");
//获取业务逻辑Bean
jobExecutorBiz = (ID2sJobExecutorBiz) SpringContextUtil.getBean("folderExecutorBizImpl");
//执行业务逻辑
jobExecutorBiz.execute(parmas);
log.debug("--------------end scheduler job--------------");
}
}
处理业务
@Component("folderExecutorBizImpl")
public class FolderExecutorBizImpl implements ID2sJobExecutorBiz {
@Override
public void execute(Map<String,Object> params) {
//业务逻辑
}
}
当服务器因停电、宕机、重器导致任务项丢失,只要将调度任务的信息存到数据库并设个执行状态,在程序中配置一个定时器,这个定时器在被加载后就去数据库里查询一下没有调度过任务并将这些什么添加到任务务列表中
spring quartz 配置
<bean id="jobContextExecutorBizImpl" class="com.bankcomm.gweb.gcms.biz.d2s.job.executor.impl.JobContextExecutorBizImpl"/>
<bean id="jobContextJobDetailFactory" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="jobContextExecutorBizImpl"/>
</property>
<property name="targetMethod">
<value>execute</value>
</property>
<property name="concurrent" value="false" />
</bean>
<bean id="jobContextCronTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail">
<ref bean="jobContextJobDetailFactory"/>
</property>
<!--载后4秒后执行 JobContextExecutorBizImpl 类的execute方法 -->
<property name="startDelay">
<value>4000</value>
</property>
<!--多少秒执行一次-->
<property name="repeatInterval" value="1000" />
<!--总共要执行几次-->
<property name="repeatCount" value="0" />
</bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="jobContextCronTrigger"/>
</list>
</property>
</bean>