本文目錄一覽:
究竟什麼才是真正的規則引擎
可能很多人還不了解規則引擎是什麼東西,或者不知道規則引擎究竟有什麼用。我們都知道工作流引擎,也聽說過JBoss下面有個Drools,或者我們知道 weblogic或者Oracle也有自己的Business Rule,我們可能還聽說過ILOG被IBM收購了,如果我們研究微軟的WWF,可能也知道其中有RuleSet等內容。國內的一些web快速開發平台,也提到了規則引擎。
在我們的印象中,我們感覺規則引擎就是解決業務邏輯層的實現問題的。因此我們理所當然的覺得工作流中的某個節點的邏輯處理,應該可以用規則引擎來解決,那麼工作流本身的邏輯也應該可以由規則引擎來解決。另外我們也會覺得,平時項目當中的業務邏輯應該都可以用規則引擎來解決。
但是當我們在使用上述這些規則引擎,卻發現很難和我們實際應用的業務邏輯層的業務邏輯實現相對應。
我們以JBoss的Drools為例,由於其規則引擎使用了匹配規則的方式來進行,因此在應用這些規則引擎時。首先需要將我們具體應用中的業務邏輯做抽象,抽象成一條條規則之後,再打包成一個規則包。一個規則包相當於一個智能塊。當數據傳遞給這個智能塊後,系統會以匹配的方式應用滿足條件的邏輯處理。
當採用這種方式時,應該說邏輯更抽象了,在一個更高的層次加以抽象化的定義。但是也使得規則引擎的應用得到了很大的限制。
首先這種抽象本身需要一個複雜的分析過程,這需要有很強的分析設計能力。另外我們平時具體應用中的業務邏輯層,大量的邏輯都是對實際數據的處理,很多時候還是一個批量數據的處理,甚至有些邏輯需要的參數我們並不能定義在規則中,而是在數據庫表中進行配置。因此我們常見的業務邏輯層的開發,並不能先設計出一個數據模型,然後再在此基礎上抽象邏輯。
因此我們發現Drools等規則引擎很難用,根本不是我們所需要的那樣。
我們研究規則引擎也有一段時間了。有時候我們發現自己做的規則引擎並不是一個規則引擎。因為我們和像Drools這些規則引擎有很大的差別。但我們確實解決了業務邏輯層的業務邏輯配置問題。應該說我們的更實用一些。但是我們卻沒法去實現JSR94標準。我們不光處理業務邏輯,還把所有業務邏輯層需要處理的操作全部採用規則配置的形式,包括數據庫處理邏輯等。
如何使用 EJB 3.0 調用規則集麻煩告訴我
RES 可作為集中式服務部署,從而響應多個客戶機的請求並同時執行多個規則集。它提供的多種規則執行組件,讓用戶可以選擇合適的執行模式,將業務規則管理系統集成到企業應用中。RES 基於模塊化的體系結構,使它即可以作為一組 Java SE POJO 對象來部署和運行,又可以在完全兼容 Java EE 的應用程序服務器上部署和運行,它將規則引擎封裝為一個 JCA 資源適配器——執行單元 (XU) 資源適配器,在應用程序服務器與規則引擎之間實施 JCA 交互,由 XU 資源適配器來管理規則引擎,加載規則集,並在業務應用和規則引擎間傳遞業務規則的調用參數和執行結果。圖1. RES 組件結構RES 支持如下執行模式:非Jave EE 容器的本地調用:業務應用需要調用 Jave SE 規則執行組件 (ODM 產品安裝目錄 /executionserver/lib/jrules-res-execution.jar),建立 Java SE 規則會話,來完成業務規則集的調用,並需要將規則執行組件 jrules-res-execution.jar 和業務應用打包在一起部署運行。Jave EE 容器內的非事務處理本地調用:業務應用需要調用 POJO 規則執行組件 (ODM 產品安裝目錄 /executionserver/applicationservers/appserver/jrules-res-session-appserver.jar),建立 POJO 規則會話,來完成業務規則集的調用,並需要將規則執行組件 jrules-res-session-appserver.jar 和業務應用打包在一起部署運行,並在部署時指定規則執行組件到 XU 的 JNDI 映射。Jave EE 容器內在規則會話上支持事務控制的本地調用:業務應用需要調用 EJB 規則執行組件 (ODM 產品安裝目錄 /executionserver/applicationservers/appserver/jrules-res-session-ejb3-appserver.jar) 的本地接口,來完成業務規則集的調用,並需要將規則執行組件 jrules-res-session-appserver.jar 和業務應用打包在一起部署運行,並在部署時指定規則執行組件到 XU 的 JNDI 映射。在下一節中,本文將為您詳細介紹。Jave EE 容器內在規則會話上支持事務控制的遠程調用:業務應用需要調用 EJB 規則執行組件 (ODM 產品安裝目錄 /executionserver/applicationservers/appserver/jrules-res-session-ejb3-appserver.jar) 的遠程接口,來完成業務規則集的調用。在下一節中,本文將為您詳細介紹。Jave EE 容器內遠程或本地的異步調用:業務應用需要調用基於消息驅動的 MDB 規則執行組件 (ODM 產品安裝目錄 /executionserver/applicationservers/appserver/jrules-res-session-mdb-appserver.jar),用戶需要在運行 RES 的 Jave EE 服務器上安裝並配置 MDB 規則執行組件 jrules-res-session-mdb-appserver.jar,並在安裝時指定規則執行組件到 XU 的 JNDI 映射。基於Web 服務的遠程調用:RES 還支持為規則集生成基於 Web 服務的規則調用服務,通過在 RES 服務器端為規則集生成決策服務,用戶可以直接使用 HTTP Request 對規則集進行調用。而通過規則執行組件調用規則集時建立的規則會話狀態的不同,業務規則的執行還可以分為有會話狀態的規則調用和無會話狀態的規則調用:無狀態的規則會話:是指在連續兩次的規則執行中,規則會話並不保存任何的執行數據和規則引擎狀態。在無狀態的規則會話中,業務應用通過規則集輸入參數將業務對象傳遞給規則引擎,並將執行結果以規則集輸出參數的方式返回給業務應用。無狀態的規則會話通常不會直接修改規則引擎的工作內存區。有狀態的規則會話:是指為當前規則會話中的規則執行保存規則引擎狀態,並提供規則引擎工作內存區的直接訪問。在有狀態的規則會話中,業務應用既可以通過規則集參數與規則引擎進行業務對象的傳遞,也可以直接訪問規則引擎的工作內存區,向工作內存區插入或提取業務對象。回頁首RES session EJB 在 WAS 上的安裝和配置如上節所述,在 Java EE 環境中使用 EJB 規則執行組件去調用業務規則集時,您具有以下選項: 使用EJB 規則執行組件的本地接口,用有狀態的規則會話或無狀態的規則會話,去調用和業務應用運行在同一個 JVM 上的 XU 去執行業務規則集。 使用EJB 規則執行組件的遠程接口,用有狀態的規則會話或無狀態的規則會話,調用運行於遠程主機 JVM 上的 XU 去執行業務規則集。而針對這兩種不同的調用結構,RES Session EJB 規則執行組件 jrules-res-session-ejb3 的打包和安裝配置也有所不同。接下來本文將以 Websphere Application Server (WAS) 為例,向您介紹 jrules-res-session-ejb3 組件的安裝和配置。業務規則集 EJB 本地調用的安裝配置對於規則集的 EJB 本地調用,需要將業務應用模塊和 EJB 規則執行組件 (rules-res-session-ejb3-WAS.jar) 一起打成一個 EAR 包,並在這個 EAR 包的 application.xml 中加入如下 XML 標籤 application module web web-uriyour_web_module.war/web-uri context-rootyour_webroot/context-root /web /module module ejbjrules-res-session-ejb3-appserver.jar/ejb /module /application 將打包好的 EAR 安裝到運行 RES 的 WAS 服務器上,在安裝時選擇”詳細 – 顯示所有安裝選項和參數”,在安裝的第 6 步,可以看到 rules-res-session-ejb3 規則執行組件所包含的兩個 EJB: IlrStatelessSessionEJB3 和 IlrStatefulSessionEJB,在這裡我們使用默認 JNDI 邦定,直接點擊下一步。圖2. EJB Bean 邦定在安裝的第 7 步我們可以看到 rules-res-session-ejb3 所定義的四個業務接口,在這裡我們同樣使用業務接口默認的 JNDI 邦定,即直接使用業務接口的名稱作為 JNDI 名字,直接點擊下一步。圖3. EJB 業務接口邦定在安裝的第 8 步我們可以看到 rules-res-session-ejb3 所需要映射的資源,即 XU 資源適配器的連接工廠,只有正確定義對 XU 的資源映射,rules-res-session-ejb3 執行組件才在可以在執行時為規則調用建立 EJB 會話。圖4. EJB 資源邦定業務規則集 EJB 遠程調用的安裝配置對於規則集的 EJB 遠程調用,需要為業務應用模塊生成一個 EJB 規則執行組件 rules-res-session-ejb3 的 Stub,來實現業務對象的序列化和反序列化並與遠程 JVM 進行通訊。大多數應用服務器都會提供為 Session EJB 生成 Stub 的功能,以 WAS 為列,可以如下生成 EJB 規則執行組件 jrules-res-session-ejb3 的 stub: WAS 安裝目錄 /bin/createEJBStubs.bat jrules-res-session-ejb3-WAS7.jar -newfile jrules-res-session-ejb3-WAS7_stub.jar將生成好的 stub 和遠程業務應用一起打包,作為規則執行的客戶端。在遠程的 RES 服務器端,將業務應用所使用的 Java Execution Object Model(XOM) class 和 EJB 規則執行組件 jrules-res-session-ejb3.jar 打包到一起,安裝到 RES 運行的 WAS 應用服務器上,安裝過程與 EJB 本地調用的安裝類似。回頁首使用EJB 3 遠程和本地調用業務規則集有狀態的 EJB 遠程調用在調用代碼中,首先需要獲得一個工廠對象 IlrEJB3SessionFactory 來獲取調用所需要的 EJB,如: IlrEJB3SessionFactory factory = new IlrEJB3SessionFactory();然後需要為工廠對象指明執行模式為遠程調用,及要使用的業務接口類型為有狀態的規則會話,之後就可以使用工廠對象去從遠程獲取一個有狀態的 SessionBean 了,需要注意的是,在創建有狀態的 SessionBean 時,一定要將規則集路徑 ilrPath 作為第一個參數傳遞給創建方法,如下: factory.setRemote(true); factory.setStatefulRemoteJndiName( “ilog.rules.res.session.impl.ejb3.IlrStatefulSessionRemote”); IlrStatefulSession statefulsession = factory.createStatefulSession(ilrPath, null, null, false);在獲取有狀態的 SessionBean statefulsession 對象後,有兩種方式向規則集傳遞參數,調用規則集,一種方式是之間通過 statefulsession 對象直接向規則引擎的工作內存區插入業務對象,如: ListObject objectList = new ArrayListObject(); objectList.add(obj1); objectList.add(obj2); statefulsession.insertJavaObjects(objectList); 一種方式是在執行時,將規則集參數以參數的方式,傳遞給 statefulsession 對象的 execute 方法,如: HashMapString, Object rulesetParameters = new HashMapString, Object(); rulesetParameters.put(“param1”, obj1); rulesetParameters.put(“param2″, obj2); IlrSessionResponse response = statefulsession.execute(rulesetParameters); 無狀態的 EJB 遠程調用和有狀態的 EJB 遠程調用一樣,首先需要創建一個工廠對象來獲取 EJB,然後為工廠對象指明執行模式為遠程調用,並指定業務接口的類型為無狀態的規則會話,之後就可以從工廠對象獲取一個無狀態的 SessionBean 了,與獲取有狀態的 SessionBean 不同,SessionBean 的創建方法不接受任何參數。如: IlrEJB3SessionFactory factory = new IlrEJB3SessionFactory(); factory.setRemote(true); factory.setStatelessRemoteJndiName(” ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote”); IlrStatelessSession statelessSession = factory.createStatelessSession(); 對於上面獲取的無狀態的 SessionBean 對象 statelessSession,其執行方式只有一種,即通過工廠對象創建一個會話請求對象,在會話請求對象中設置規則集執行參數,規則集路徑,及執行軌跡等相關信息,並把這個會話請求對象作為參數,傳遞給 SessionBean 的 execute() 方法,如: IlrSessionRequest request = factory.createRequest(); request.setRulesetPath(IlrPath.parsePath(rulesetPath)); request.setInputParameters(ruleset_params); request.setTraceEnabled(true); IlrSessionResponse response = statelessSession.execute(request); EJB 本地調用和遠程調用一樣,EJB 規則執行組件的本地調用也分為有狀態的本地調用和無狀態的本地調用兩種方式。除了通過工廠對象創建 SessionBean 的方法略有不同外,本地執行和遠程執行的 API 是一樣的。對於本地有狀態的 EJB 調用,可通過如下方式獲取一個有狀態的 SessionBean,在獲取 SessionBean 對象後,其執行方式與遠程的有狀態執行一致。 factory = new IlrEJB3SessionFactory(); factory. setStatefulLocalJndiName (” ejblocal:ilog.rules.res.session.impl.ejb3.IlrStatefulSessionLocal”); IlrStatefulSession statefulsession = factory.createStatefulSession(ilrPath, null, null, false); 對於本地無狀態的 EJB 調用,可通過如下方式獲取一個無狀態的 SessionBean,在獲取 SessionBean 對象後,其執行方式與遠程的無狀態執行一致。 factory = new IlrEJB3SessionFactory(); factory.setStatelessLocalJndiName( “ejblocal:ilog.rules.res.session.impl.ejb3.IlrStatelessSessionLocal”); IlrStatelessSession statelessSession = factory.createStatelessSession(); 回頁首結束語EJB 規則執行組件作為 RES 的一個重要組成部分,不僅很好的支持了有狀態的規則會話和無狀態的規則會話執行方式,還可以在傳統的規則會話上引入由應用服務器容器提供的事務處理和遠程訪問功能,更加方便用戶將業務規則系統集成到業務應用當中。參考資料 參考WebSphere Operational Decision Management 首頁, 查看有關 WebSphere Operational Decision Management 產品的更多信息。
參考WebSphere Operational Decision Management 文檔,查看關於 RES 使用的更多信息。
IBM developerWorks 中國,WebSphere 專區:為使用 WebSphere 產品的開發人員準備的技術信息和資料。這裡提供產品下載、how-to 信息、支持資源以及免費技術庫,包含 2000 多份技術文章、教程、最佳實踐、IBM Redbook 和在線產品手冊。
IBM developerWorks 軟件下載資源中心:IBM developerWorks 最新的軟件下載。
加入developerWorks 中文社區:developerWorks 社區是一個面向全球 IT 專業人員,提供博客、書籤、wiki、群組、聯繫、共享和協作等社區功能的專業社交網絡社區。
加入IBM 軟件下載與技術交流群組,參與在線交流。
IBM developerWorks 工具包:下載關鍵 WebSphere 最新的產品工具包。
關於作者趙學良 ,IBM 中國軟件開發中心軟件工程師。自 2008 年起,任職於 IBM Operational Decision Management 團隊。關閉[x]關於報告濫用的幫助報告濫用謝謝! 此內容已經標識給管理員注意。關閉[x]關於報告濫用的幫助報告濫用報告濫用提交失敗。 請稍後重試。關閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發布的內容一同顯示。所有提交的信息確保安全。關閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發布的內容顯示在一起。昵稱長度在 3 至 31 個字符之間。 您的昵稱在 developerWorks 社區中必須是唯一的,並且出於隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字符之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首
「規則引擎」是什麼?
規則引擎是一個將業務決策從應用程序代碼中分離出來,並使用預定義的語義模塊編寫業務決策的組件,它接受數據輸入,解釋業務規則,並根據業務規則做出業務決策。”目前有很多規則引擎的軟件的,RDE規則引擎和iLog都是比較不錯的產品,值得選擇。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238970.html