訊息驅動批次規則引擎 (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;
	}
}
ċ
BatchRules.7z
(3k)
李智,
2015年3月19日 上午10:27