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

設計情境回首頁

  • 批次引擎由時間事件驅動,時間指定規則與 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.quartz.JobBuilder.*; import static org.quartz.TriggerBuilder.*; import static org.quartz.CronScheduleBuilder.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class BatchRules { private final Logger myLog = LoggerFactory.getLogger(getClass()); String jobName, jobGroup, jobParam; public BatchRules(String jobName, String jobGroup, String jobParam) { this.jobName = jobName; this.jobGroup = jobGroup; this.jobParam = jobParam; Properties dbProps = new Properties(); dbProps.put("user", "job1"); dbProps.put("password", "job1"); Connection dbConn = null; Statement sqlStatement = null; try { dbConn = DriverManager.getConnection( "jdbc:derby:BatchRules;create=true", dbProps); dbConn.setAutoCommit(true); sqlStatement = dbConn.createStatement(); } catch (SQLException e) { dbConn = null; sqlStatement = null; this.myLog.error(String.format("DriverManager:%s", e.getMessage())); } if (dbConn != null && sqlStatement != null) { try { sqlStatement .execute("CREATE TABLE FriendList(nameFriend varchar(64), isFriend int, ageFriend int)"); } catch (SQLException e) { if (e.getSQLState().equals("X0Y32")) { try { sqlStatement.execute("TRUNCATE TABLE FriendList"); } catch (SQLException e1) { this.myLog.error(String.format("TRUNCATE TABLE:%s", e.getMessage())); } } else { e.printStackTrace(); } } } if (dbConn != null) try { dbConn.close(); } catch (SQLException e) { } } 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; } }