quartz是opensymphony提供的用來做SCHEDULE的框架
在spring中通過org.springframework.scheduling.quartz.SchedulerFactoryBean來獲得Schedule類
1 2 3 4 5 6 7 8 9 10 11 12
| <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
1 2 3 4 5 6
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| publicclass DefaultQuartzJob implements Job {
?
privatestatic Logger logger = Logger.getLogger(DefaultQuartzJob.class);
?
publicvoid 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]);
}}elseif(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接口,繼承它可以實現不同的任務實現
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| /**
* 定時任務的基本接口
*/publicinterface Task
{
?
/**
* 任務執行
*
* @param request
* 請求參數
* @param response
* 返回參數
* @param cxt
* @roseuid 4535938002AC
*/publicvoid process(TaskContext cxt) throws TaskException;
?
/**
* 任務名稱
*
* @return java.lang.String
* @roseuid 453DB0AB01B5
*/public String getName();
} |
2.從scheduler中刪除一個任務
1
| scheduler.deleteJob(taskName, Scheduler.DEFAULT_GROUP);
|
二.Trigger定時器,任務與定時器是一對多的關系
1.新建Trigger,初步分為CRONTRIGGER,SIMPLETRIGGER
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 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);
thrownew TaskException("0096", "Catch exception " + e.getMessage()
+ " while adding trigger " + triggerName
+ " into scheduler", e);
}
?
|
2.刪除Trigger
1 2 3 4 5 6 7 8 9 10
| try{
scheduler.unscheduleJob(triggerName, Scheduler.DEFAULT_GROUP);
}catch (SchedulerException e) {
logger.error("Catch exception " + e.getMessage()
+ " while remove trigger " + triggerName
+ " from scheduler", e);
thrownew TaskException("0096", "Catch exception " + e.getMessage()
+ " while removing trigger " + triggerName
+ " from scheduler", e);
|
posted on 2007-01-12 19:32
???MengChuChen 閱讀(2132)
評論(0) 編輯 收藏 所屬分類:
Spring