【永恒的瞬間】
          ?Give me hapy ?
          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 閱讀(2140) 評論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 宁德市| 叙永县| 武穴市| 清苑县| 贵南县| 衢州市| 高台县| 苏州市| 玉溪市| 新晃| 铜山县| 海伦市| 宝丰县| 伊吾县| 闽侯县| 舒兰市| 铁岭县| 枣强县| 东城区| 青海省| 曲麻莱县| 腾冲县| 南木林县| 灵台县| 利辛县| 满洲里市| 巩留县| 寿宁县| 福州市| 县级市| 灵璧县| 虞城县| 龙岩市| 固始县| 澄城县| 阿瓦提县| 玛纳斯县| 冀州市| 屏东县| 盐池县| 工布江达县|