初探quartz scheduler

quartz是opensymphony提供的用来做SCHEDULE的框架

在spring中通过org.springframework.scheduling.quartz.SchedulerFactoryBean来获得Schedule类
	<bean id="quartzSchedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton">
<!-- set quartz scheduler factory configuration location -->
<!-- <property name="configLocation" value="" /> -->
<!-- 系统会在启动时加载 -->
<property name="autoStartup" value="true" />
</bean>
<bean id="taskManage" class="com.sumit.task.TaskManage" scope="singleton">
<property name="taskDAO" ref="taskDao" />
<property name="scheduler" ref="quartzSchedulerFactory" />
</bean>

QUARTZ中有Job与Trigger两种概念

一.Job详细描述具体的任务运行代码实现
1.新增一个任务到scheduler

JobDetail job = new JobDetail(taskName, Scheduler.DEFAULT_GROUP,DefaultQuartzJob.class);
JobDataMap jobDataMap = job.getJobDataMap();
//根据PUT不同的TASK而运行不同的任务
jobDataMap.put("Task", task);
job.setDurability(true);
scheduler.addJob(job, true);

==>DefaultQuartzJob

public class DefaultQuartzJob implements Job {

private static Logger logger = Logger.getLogger(DefaultQuartzJob.class);

public void execute(JobExecutionContext ctx) throws JobExecutionException { JobDataMap jobDataMap = ctx.getJobDetail().getJobDataMap();
TaskTO task = (TaskTO) jobDataMap.get("Task");

Task entryTask = task.getEntryTask();

if (entryTask == null) { logger
.error("Task " + task.getName()
+ " couldn't be initialized!");
return;
}
TaskContext taskContext = new DefaultTaskContext();

// 将触发任务的Trigger中所有的参数添加到上下文中
JobDataMap triggerDataMap = ctx.getTrigger().getJobDataMap();
String[] keys = triggerDataMap.getKeys();
if (keys != null) { for (int i = 0; i < keys.length; i++) { Object obj = triggerDataMap.get(keys[i]);
if (obj instanceof String[]) { String [] data=(String[]) obj;
if(data.length>0){ taskContext.setParameter(keys[i], data[0]);
} } else if(obj instanceof String){ taskContext.setParameter(keys[i], (String)obj);
} } } try { // 为任务时间执行次数加1
TaskManage tm = (TaskManage) triggerDataMap
.get(TaskManage.TASKMANAGE_ATTRIBUTE_NAME);
tm.addTriggerExecuteTimes(triggerDataMap
.getString(TaskManage.TRIGGER_ATTRIBUTE_NAME));
} catch (TaskException e) { logger.error(
"catch exception while process task " + task.getName(), e);
} try { //根据实例化不同的TASK而运行不同的任务
entryTask.process(taskContext);
} catch (TaskException e) { logger.error(
"catch exception while process task " + task.getName(), e);
} } }
==>TASK接口,继承它可以实现不同的任务实现

/**
* 定时任务的基本接口
*/
public interface Task
{
/**
* 任务执行
*
* @param request
* 请求参数
* @param response
* 返回参数
* @param cxt
* @roseuid 4535938002AC
*/
public void process(TaskContext cxt) throws TaskException;

/**
* 任务名称
*
* @return java.lang.String
* @roseuid 453DB0AB01B5
*/
public String getName();
}

2.从scheduler中删除一个任务

scheduler.deleteJob(taskName, Scheduler.DEFAULT_GROUP);

二.Trigger定时器,任务与定时器是一对多的关系
1.新建Trigger,初步分为CRONTRIGGER,SIMPLETRIGGER

if (TRIGGER_CRON.equals(triggerType)) {
//创建CRONTRIGGER
trigger = new CronTrigger(triggerName, Scheduler.DEFAULT_GROUP,
taskName, Scheduler.DEFAULT_GROUP, validStartTime,
validEndTime, triggerPattern);
trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
} else { //创建SIMPLETRIGGER
trigger = new SimpleTrigger(triggerName,
Scheduler.DEFAULT_GROUP, taskName,
Scheduler.DEFAULT_GROUP, validStartTime, validEndTime,
repeatCount, repeatInterval);
trigger.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT);
}
try { //添加trigger到scheduler
scheduler.scheduleJob(trigger);
logger.debug("trigger " + trigger.getName()
+ " have been loaded to scheduler!");
} catch (SchedulerException e) { logger.error("Catch exception " + e.getMessage()
+ " while adding trigger " + triggerName
+ " into scheduler", e);
throw new TaskException("0096", "Catch exception " + e.getMessage()
+ " while adding trigger " + triggerName
+ " into scheduler", e);
}

2.删除Trigger
try {
			scheduler.unscheduleJob(triggerName, Scheduler.DEFAULT_GROUP);
} catch (SchedulerException e) { logger.error("Catch exception " + e.getMessage()
+ " while remove trigger " + triggerName
+ " from scheduler", e);
throw new TaskException("0096", "Catch exception " + e.getMessage()
+ " while removing trigger " + triggerName
+ " from scheduler", e);
}

ps:以上代码片段只提供参考,不可能运行成功,原因是没有贴出全部依赖代码.scheduler的所有方法都是官方提供,可以使用.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值