posts - 176, comments - 240, trackbacks - 0, articles - 7

          [導入]Quartz 任務調(diào)度

          Posted on 2005-11-22 17:55 canonical 閱讀(1106) 評論(0)  編輯  收藏 所屬分類: 軟件開發(fā)

          quartz是一個高質(zhì)量的任務調(diào)度軟件包。其主要組成部分為:

          Scheduler接口: quartz的執(zhí)行線程,它根據(jù)Trigger決定調(diào)度時刻,根據(jù)JobDetail的說明實例化并運行Job

          JobDetail類: 可持久化的任務描述信息。任務雖然分組,但是僅用作管理標示,任務之間并無實質(zhì)性關聯(lián), 例如無法定義job chain。

          Trigger類:任務的調(diào)度策略。這里的特點是調(diào)度策略與任務描述分開,調(diào)度策略和任務描述都可以分別在Scheduler注冊,然后再關聯(lián)起來。JobDetail與Trigger的關系是一對多。

          JobDataMap: 將任務的運行時可持久化狀態(tài)信息從JobDetail類中分離出來

          Job接口: 任務的執(zhí)行代碼

          StatefulJob接口: 無狀態(tài)任務對應的JobDataMap可以認為是只讀的,而有狀態(tài)的任務在多次執(zhí)行過程中保留對JobDataMap所作的修改,一個后果是有狀態(tài)任務無法被并發(fā)執(zhí)行。

          JobExecutionException類: 可以通過JobExecutionException調(diào)整調(diào)度程序的下一步動作
          Calendar接口: 用于從trigger的調(diào)度計劃中排除某些時間段,例如假期等。

          以上幾個部分的交互關系如下:
          class JobImpl implements Job{
              public void execute(JobExecutionContext context) throws JobExecutionException{
                  JobDetail detail = context.getJobDetail();
                  JobDataMap dataMap = detail.getJobDataMap();
                  ...
              }
          }

          scheduler.addCalendar("myHolidays", holidayCalendar, false);
          trigger.setCanlendarName("myHolidays");

          JobDetail jobDetail = new JobDetail(jobName, jobGroupName, JobImpl.class);

          scheduler.scheduleJob(jobDetail, trigger);

          JobDetail可以設置如下屬性:
          1. Durability: non-durable的任務當不再與任何active trigger關聯(lián)的時候?qū)膕cheduler中被自動刪除。
          2. Volatility: volatile的任務在scheduler的兩次啟動之間不會被持久化
          3. RequestsRecovery: 如果在執(zhí)行過程中程序意外崩潰,標記為"request recovery"的任務在scheduler重起之后將會被再次執(zhí)行,此時JobExecutionContext.isRecovering()返回true.

          Trigger可以設置如下屬性:
          1. misfireInstruction: 設定當trigger錯過了觸發(fā)時刻的時候需要采取的處理策略

          SimpleTrigger按照固定的時間間隔進行觸發(fā)
          startTime, endTime, repeatCount, repeatInterval

          CronTrigger按照日歷間隔進行觸發(fā)
          seconds minutes hours day-of-month month day-of-week

          在quartz內(nèi)部,QuartzSchedulerThread按照時間順序選擇trigger(沒有任務優(yōu)先級的概念), 然后在JobRunShell中運行Job。

          JobRunShell中的調(diào)用順序如下:

          TriggerListener.triggerFired
              Called by the Scheduler when a Trigger has fired, and it's associated JobDetail is about to be executed.

          TriggerListener.vetoJobExecution
              Called by the Scheduler when a Trigger has fired, and it's associated JobDetail is about to be executed.

          JobListener.jobToBeExecuted
              Called by the Scheduler when a JobDetail is about to be executed (an associated Trigger has occured).

          Job.execute
              Called by the Scheduler when a Trigger fires that is associated with the Job.
           
          JobListener.jobWasExecuted
              Called by the Scheduler after a JobDetail has been executed, and be for the associated Trigger's triggered(xx) method has

          been called.

          Trigger.executionComplete
              Called after the Scheduler has executed the JobDetail associated with the Trigger in order to get the final instruction

          code from the trigger.

          TriggerListener.triggerComplete
               Called by the Scheduler when a Trigger has fired, it's associated JobDetail has been executed, and it's triggered(xx)

          method has been called.

          SchedulerListener.triggerFinalized [if(trigger.getNextFireTime() == null)]
               Called by the Scheduler when a Trigger has reached the condition in which it will never fire again.
          主站蜘蛛池模板: 陆河县| 昌吉市| 武川县| 新沂市| 平武县| 大丰市| 安泽县| 于都县| 宜昌市| 伊春市| 南开区| 陇西县| 白城市| 大厂| 通江县| 昭平县| 会昌县| 景东| 洞口县| 临西县| 西和县| 铁力市| 贵州省| 安达市| 天等县| 高雄县| 治县。| 大石桥市| 黑水县| 汽车| 屏南县| 唐山市| 宜黄县| 湖南省| 麻栗坡县| 临潭县| 朝阳县| 东阳市| 缙云县| 密山市| 门源|