訊息驅動批次規則引擎 (1)

設計情境回首頁

  • 批次引擎由時間事件驅動,時間指定規則與 UNIX Crontab 類似。
  • 當系統中斷事件觸發時,會自動中止批次引擎。
    • 當時間事件被觸發時,會調用事件元件執行處理。
  • 事件元件連接訊息佇列引擎,並等候訊息來臨。
  • 當訊息來臨時,會調用規則引擎元件。
  • 規則引擎元件依據訊息內容,決定是否要執行指定作業。

主程式時間觸發 服務中止處理 規則元件 發送訊息

package com.progria; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import static org.quartz.JobBuilder.*; import static org.quartz.TriggerBuilder.*; import static org.quartz.CronScheduleBuilder.*; public class BatchRules { String jobName, jobGroup, jobParam; public BatchRules(String jobName, String jobGroup, String jobParam) { this.jobName = jobName; this.jobGroup = jobGroup; this.jobParam = jobParam; } public void batchJob(Scheduler myScheduler, int timeElapse) { try { JobDetail myJob = newJob(BizRuleSet.class) .withIdentity(this.jobName, this.jobGroup) .usingJobData("jobParam", this.jobParam).build(); String triggerScript = String.format("0/%d * * * * ?", timeElapse); Trigger myTrigger = newTrigger() .withIdentity(this.jobName, this.jobGroup) .withSchedule(cronSchedule(triggerScript)).build(); myScheduler.scheduleJob(myJob, myTrigger); } catch (SchedulerException e) { e.printStackTrace(); } } public static void main(String[] args) { int WAIT_SECONDS = 90; String mqParams = "localhost|hello2"; if (args.length > 0) { try { WAIT_SECONDS = Integer.parseInt(args[0]); } catch (Exception e) { e.printStackTrace(); } } if (args.length > 1) { mqParams = (args[1]); } BatchRules myBatchRules = new BatchRules("job1", "jobGroup1", mqParams); try { Scheduler myScheduler = StdSchedulerFactory.getDefaultScheduler(); Runtime.getRuntime().addShutdownHook( new ShutdownScheduler(myScheduler)); myScheduler.start(); myBatchRules.batchJob(myScheduler, WAIT_SECONDS); for (; !myScheduler.isShutdown();) { Thread.sleep(WAIT_SECONDS * 1000L); } myScheduler = null; } catch (Exception e) { e.printStackTrace(); } myBatchRules = null; } }