通常情況下,如果企業的業務策略在應用程序中實現的時候,隨著業務的發展和策略的不斷變化,這種實現方式就會變得越來越複雜、缺少靈活性而造成無法做出快速的反應。而業務規則管理系統 (Business Rule Management System ,BRMS) 的出現,對於應用程序的開發者和業務用戶來講,則提供一種對業務策略的管理更加有效的解決方案。應用業務規則管理系統,開發者和架構師可以在獨立於應用邏輯之外去管理業務邏輯,允許業務用戶獨立於企業的 IT 部門去管理業務策略。與此同時,像 SOA 這樣的 IT 架構的出現,使業務邏輯可以在業務規則管理系統中封裝成供應用程序和業務流程調用的規則服務。IBM ILOG JRules 就是一個很好的允許業務人員和 IT 開發人員使用的業務規則管理系統,它可以提高業務發展,使業務策略自動化。
在對規則集調用的過程中,根據 XOM 和設計需求,可以採用 POJO、EJB、JMS、Web 服務等調用方式。本文結合場景實例提出了一種基於 Web 服務的調用實現方式,同時,在 ILOG JRules V7.0 的使用指南文檔中,也介紹了一種用 JAX-WS 2.1.1 將規則集部署為決策服務的調用方式,如感興趣,請參見指南 Integrating into an enterprise application部分。本文給出的方案中選用 Axis 創建調用規則集的 Web 服務,調用過程效率高、響應快,編程更加方便、靈活,且能滿足 SOA 的架構要求。
ILOG JRules V7.0 通過一組創新模塊來創建、管理和部署業務規則,從而實現完善的性能。
ILOG JRules Rule Studio:適用於規則應用程序的集成開發環境 (IDE) 。Rule Studio 直接針對 IDE 的 Eclipse 系列,其中包括 Eclipse IDE。Rule Studio 支持對 ILOG JRules Rule Execution Server 進行規則集調試和部署,還可以通過 Rule Team Server 實現業務規則的編寫者之間的協作。
ILOG JRules Execution Server:是一個穩定的與 J2SE 和 J2EE 兼容的可管理的規則執行環境,運行在 Web 伺服器或應用程序伺服器上。它將規則引擎打包作為一個 Java Connector Architecture(J2C) 資源適配器。Rule Execution Server 包括一個 Web 管理控制台,可以對部署在上面的規則集進行有效的版本控制和管理。Rule Execution Server 與 Rule Studio 和 Rule Team Server 完全集成,可以同時支持開發人員和策略管理者的業務規則部署。
具有下列特性:
易用性好:
在集成了 Eclipse 的環境中工作,通過自動更正和”智能規則”輕鬆快速地使用與自然語言一致的規則語言編寫規則;
使用靜態規則分析檢測衝突和冗餘;
規則流的創建可以進行可視化的組裝和拆分,並滿足所設計的粒度要求;
可獨立於應用邏輯對業務規則應用程序進行快速部署和調試;
管理方便:
通過基於許可權的規則訪問向業務人員提供控制權的同時,維護應用程序完整性;
通過測試、共同調試和重構進行反覆開發;
使用單一界面和規則庫管理代碼和規則;
同時應對多個發布周期,在準備下一個產品發布的同時維護仍在進行的產品發布;
可控性:
通過受控的執行過程來報告和監控規則;
查看有關所有規則變更和部署地完整歷史記錄;
在保險或金融等行業解決方案中,如員工的薪水計算或員工的升遷降職處理,都會根據員工的
各項指標和企業管理條例來進行相應的計算和處理,這個過程中就要涉及到大量的業務策略或規則。本文將以員工薪水計算功能中的業務規則應用開發與集成場景為舉例,不同的規則決定
不同的薪水計算方式,但由於實際需求中,這些規則又是靈活多變的,因此,把薪水計算的規則提取出來並應用 ILOG JRules 使其在不影響應用程序代碼性能的前提下進行獨立地快速開發、調試、部署和管理,並以一種 Web 服務的調用方式對其與任意客戶端進行集成,是一種非常好的解決方案。
執行對象模型是一種在規則被執行的過程中要基於的一種對象模型。業務規則通過業務對象模型 (BOM) 中的辭彙和術語來編寫,之後被 ILOG JRules 編譯成 ILOG Rule Language(IRL) 語言,在規則的運行狀態中,規則引擎可以訪問 XOM 中的屬性和方法。
在 JRules 中,執行模型的實現方式主要可分為二種,一種是 Java Classes,即 JAVA XOM;另一種是 XML Schema,即 Dynamic Classes。規則引擎訪問 XOM 時依據 XOM 的實現方式而採用不同的訪問方式。例如,若採用 JAVA XOM,則要將它打包到應用程序端中並隨之一起部署,在運行的時候,應用程序的類載入器會使執行環境可以訪問它。在不同的情況下,可以根據實際需求來選擇 XOM 的設計和實現方式,但 Java 類的實現方式相比之下,更加易用,因為它不僅含有屬性,而且類中定義的方法會給業務規則的設計和編寫過程帶來很大的方便和靈活性。因此,本文中設計 XOM 選擇了 Java 類的實現方式,通過自動解析 Java 類,用它的方法和屬性來創建業務對象模型 (Business Object Model)。然後就可以通過業務對象模型中所包含的辭彙術語來編寫規則。
清單 1 為執行對象模型的部分代碼,即設計為一個 Java 類,其中類 Agent 的設計在本例中代表員工信息。該類也會定義為規則集的輸入和輸出參數,當它作為規則集的輸入時,它的基本屬性中包括了薪水計算規則用到的一些前提條件;在規則的執行過程中,它的一些屬性會保存中間變數值;當計算規則執行結束後,它的一些屬性值為代表薪水計算的各項結果並被保存,作為輸出參數返回到客戶端。此類中的方法的靈活之處在於它可以用來計算一些中間變數值或實現一些較為複雜的計算過程等,以提供給業務規則執行時調用 ( 與 XSD Schema 方式相比作用較明顯 )。
Public class Agent { |
// 以下屬性為計算的前提條件變數(部分)
privateDate onboardDate; // 入司日期
privateString rank; // 職級
private doubleperformanceAmount; // 業績額
private booleanworkState; // 是否在職
privateString[][] rankHistory; // 職位和時間歷史記錄
privateDate computationDate; // 計算薪水的日期
. . . . . . |
// 以下為薪水計算規則執行過程中所需的中間變數(部分)
public booleanqualified =false; // 是否有授予某項獎金資格
public intonboardYearNum = -1; // 入司年份
public intonboardMonthNum = -1; // 入司月
public intonboardDayNum = -1; // 入司日
. . . . . . |
// 以下屬性為保存計算結果變數
private doublestartupsSubsidy; // 創業津貼
private doublequarterAward; // 個人季度獎金
private double totalAmount; // 薪水總計額度
*設計方法*
// 計算月平均業績額
public double computeMonthlyAmount(){ . . . . . . } Public double getXXX(){ … } Public double setXXX(){ … } . . . . . . } |
在本例中完成以上工作之後和對規則集的調用之前,還需要依次完成下列主要步驟:
首先在 Rule Studio 中創建一個規則工程,在設計階段導入 Java Excution Object Model,即 XOM。
然後通過工具解析導入的 XOM 自動創建業務對象模型 (Business Object Model),至此,我們可以看到用來編寫業務規則的辭彙和術語。
在接下來的業務規則的編寫過程中,就可以定義規則分類包,並應用 ILOG JRules 支持的三種自然語言、決策表或決策樹的方式直觀地對規則進行靈活快速地編寫。
定義規則集的輸入和輸出參數。
在規則流 (ruleflow) 的設計過程中,一個規則集只能定義一個主規則流 (main flow task 屬性為 true),它包含規則集執行的入口和出口,但一個規則集可以支持多個子規則流 (main flow task 屬性為 false),每一個子規則流又是由執行起點和終點、一條或多條業務規則、判斷分支等共同組成,而一個主規則流又可以根據業務規則需要由多個子規則流組裝而成。這樣的規則流的設計粒度就可以達到我們所要求的粒度,可以對主規則流進行靈活的拆分和組裝,非常靈活、方便快捷。
在完成了上述的工作以後,就可以在 Rule Studio 工具中自動創建將規則集打包的規則應用工程 RuleApp,並把它實時部署到 Rule Execution Server 上,之後就可以通過規則路徑去調用 RuleApp 中的 Ruleset,同時,通過 Web 許可權管理控制台就可以對其進行有效管理。
至此,在本例中已成功完成了業務規則集的開發和部署,也可以在 Rule Studio 中進行調試。
調用過程如圖 1 所示:
圖 1. 客戶端對 ILOG JRules 規則集調用集成模型
在本文給出的調用模型中,需要先將規則應用部署在運行在 Web 伺服器中規則執行環境 Rule Execution Server 中。調用的實現過程中,主要先採用 POJO 會話方式對規則集進行本地調用,再將本地調用規則集的 Java 類利用 Axis 發布成 Web 服務,最後在應用程序客戶端創建調用此規則服務的代碼,即成功實現了以 Web 服務方式調用規則應用的目的,從而實現與客戶端的良好集成,這種調用方式效率很高。由於先採用對規則集的本地調用,因此,需要將具有本地調用規則集功能的 Web 服務工程和規則執行環境 Rule Execution Server 部署在相同的 Web 伺服器上。
在可管理的規則執行環境 Rule Execution Server 中,規則引擎由 Execution Unit (XU) 來控制,而 Execution Unit(XU) 是一個資源適配器,它能夠管理規則引擎,裝載規則集,以及在應用程序和規則引擎之間傳遞數據。XU 處理規則集執行的低層細節,如池和多線程處理,並能提供對資源的訪問和管理熱部署。應用伺服器或應用程序客戶機使用 XU 連接規則引擎。
下面給出具有本地調用規則集功能的 Web 服務的工程目錄結構,如圖 2 所示:
圖 2. 調用規則集的 WebService 工程文件目錄結構圖
在本例中,創建本地調用規則集的 Web 服務工程並將其命名為 IncomeService,從服務發布成功後的目錄結構圖中,可以清楚看到所需要和生成的各個主要文件。下面對一些重要的文件和代碼進行給出示例和說明。
本例中調用規則集的核心類是一個 Java 類,例中名為:ComputeIncomeBean.java;它
獲得來自於客戶調用服務時的輸入參數,在成功調用並執行薪水計算規則集後,獲得保存有計算結果的參數 Agent,並將其作為服務的輸出參數返回給客戶端。
public class ComputeIncomeBean { public Agent computeAgentIncome(Agent agent){ String executionError = null; String rulesetVersion = Messages.getString(“latest”); IlrSessionFactory sessionFactory = null; try { // get a rulesession if (sessionFactory == null) { sessionFactory = new IlrJ2SESessionFactory(); } // Create a session request object IlrSessionRequest sessionRequest = sessionFactory.createRequest(); // rulesetPath=”/ComputeSalaryApp/2.0/ComputeSalary” String rulesetPath = Messages.getString(“rulesetPath”); if (!rulesetVersion.equalsIgnoreCase(Messages.getString(“latest”))) { rulesetPath = rulesetPath + “/” + rulesetVersion; } sessionRequest.setRulesetPath(IlrPath.parsePath(rulesetPath)); // Enable trace to retrieve info on executed rules sessionRequest.setTraceEnabled(true); sessionRequest.getTraceFilter().setInfoAllFilters(true); // Set the input parameters for the execution of the rules Map<String,Object> inputParameters = sessionRequest.getInputParameters(); inputParameters.put(“agent”, agent); IlrStatelessSession session = sessionFactory.createStatelessSession(); // execute and get the response for this request IlrSessionResponse response = session.execute(sessionRequest); IlrExecutionTrace sessionTrace = response.getRulesetExecutionTrace(); agent = (Agent) response.getOutputParameters().get(“agent”); } return agent; } } |
以下文章點擊率最高
Loading…