jboss drools_JBoss Drools –入门
jboss drools
這篇文章是關于我如何掌握JBoss Drools的 。 其背后的原因是:SAP收購了我公司當前的規則引擎,而Drools是我們將尋找的另一種選擇,只要有人有能力提高概念驗證的能力。盡管似乎有大量的文檔,但是我總是會通過示例來發現它是有幫助的,這就是我在這里要做的事情。乍一看,流口水令人生畏,它由以下內容組成:
Drools Expert (規則引擎)
作為開發人員,這是我開始的地方,它們的實際規則和實現。
我稍后將討論的其他部分是:
Drools Guvnor (BRMS / BPMS)
流口水流程 (流程/工作流程) Drools Fusion (事件處理/時間推理) Drools Planner (自動計劃)
因此開始。
首先,我只想弄濕我,只下載Eclipse插件和二進制文件
需要安裝Eclipse插件,用于更新站點 。 將二進制文件解壓縮到目錄,然后將Eclipse插件設置指向該目錄。
eclipse插件將允許您創建一個Drools項目,其中包括“ Drools庫”,但是如果您正在使用Maven,則需要指向Drools依賴項的JBoss版本庫 ,KnowledgeRuntimeLoggerFactory需要XStream,您可以從中獲取標準的Maven回購 以下是我的POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelversion>4.0.0</modelVersion><groupId>javaitzen.drools</groupId><artifactid>LearningToDrool</artifactId><version>0.0.1-SNAPSHOT</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build><properties><drools.version>5.1.1</drools.version></properties><repositories><repository><name>JBoss</name><id>JBoss</id><url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url></repository></repositories><dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactid>drools-compiler</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.3.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version><scope>test</scope></dependency></dependencies></project>要添加規則,請在src / main / rules上單擊鼠標右鍵->新建->其他…Drools / Rule資源,請確保選擇“單個規則”。 這給您留下了一個空的drl文件:
package javaitzen.drools.rulesrule "A stand alone rule"when#conditionsthen #actions end 為了理解和使用規則語言,我閱讀了Drools文檔和示例項目。
實際上讓我有點了解的是基本語法以及規則中對象的處理方式,我確實很難找到任何可以簡單解釋其內容的內容,因此我將對其進行介紹。
關于變量名的注釋..它們不需要帶有'$',但是在示例中使用了它,沒有它,很快就會變得很混亂。
現在逐步了解規則的各個部分:
package javaitzen.drools.rulesimport javaitzen.drools.RoolVOrule "Basic Rule"when$vo : RoolVO( stringValue == "Learning to drool", $booleanVal : booleanValue )eval( $booleanVal )then System.out.println( "First Rule" ); $vo.setStringValue("Done."); end 包和import關鍵字很容易解釋,在when之后發生的事情不是。
實際發生的“ $ vo:RoolVO(stringValue ==“學習流口水”,$ booleanVal:booleanValue)”中發生的事情是:
stringValue ==“學習流口水” –這是一個約束,它使我們能夠找到知識庫中所有具有getStringValue()值等于“學習流口水”的RoolVO對象。 如果有多個符合RoolVO的實例,我們將多次執行此規則,這些實例也稱為匹配對象。 您還可以有多個約束,以“,”分隔。
$ booleanVal:booleanValue –我們正在聲明一個名為boolean的新布爾變量,類型為$ booleanVal,并從isBooleanValue獲取其值。
$ vo:RoolVO –我們正在聲明一個名為$ vo的RoolVO類型的新局部變量。
下一行:
“ eval($ booleanVal)” –計算布爾變量,對于要調用的規則的“ then”部分,需要將其評估為true。
然后: System.out.println(“第一條規則”); –標準系統輸出。 $ vo.setStringValue(“ Done。”); –將與約束匹配的當前RoolVO對象上的String值設置為Done。
執行基本規則所需的主要類/接口如下:
org.drools.KnowledgeBase及其工廠
org.drools.KnowledgeBaseFactory: 這是所有相關知識定義的存儲庫; 它包含規則,流程,功能,類型模型。
org.drools.builder.KnowledgeBuilder及其工廠org.drools.builder.KnowledgeBuilderFactory:
將源文件(.drl,.xsl)轉換/解析為KnowledgeBase可以理解的KnowledgePack。
由知識庫創建的StatefulKnowledgeSession .newStatefulKnowledgeSession();
該會話用于與實際規則引擎進行通信。
引用Drools JavaDocs:
StatefulKnowledgeSession是與規則引擎進行交互的最常用方法。 StatefulKnowledgeSession允許應用程序與引擎建立迭代對話,對于同一組數據,推理過程可能會被多次觸發。
我為前面描述的規則編寫了一個簡單的測試。
package javaitzen.drools;import static org.junit.Assert.assertEquals;import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.logger.KnowledgeRuntimeLogger; import org.drools.logger.KnowledgeRuntimeLoggerFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.junit.Before; import org.junit.Test;public class TestBasicRules {private KnowledgeBase kbase;@Beforepublic void setup() {KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add(ResourceFactory.newClassPathResource("basic.drl"), ResourceType.DRL);KnowledgeBuilderErrors errors = kbuilder.getErrors();if (errors.size() > 0) {for (KnowledgeBuilderError error: errors) {System.err.println(error);}throw new IllegalArgumentException("Could not parse knowledge.");}kbase = KnowledgeBaseFactory.newKnowledgeBase();kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());}@Testpublic void testBasic() {StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");RoolVO vo = new RoolVO();vo.setStringValue("Learning to drool");vo.setBooleanValue(true);ksession.insert(vo);ksession.fireAllRules();for (Object o: ksession.getObjects()) {if(o instanceof RoolVO) {assertEquals("Done.", ((RoolVO) o).getStringValue());}} logger.close();}}老實說,從我在第一個任務中所見,Drools并不像Quickrules那樣直觀。 但是,在下面,我將開始研究規則流,決策表功能以及指導規則的使用:
那些與DSL(特定域語言)構造合作的人希望確實允許創建更直觀的規則。
以前,我經歷了基本語法和要求,以開發和測試規則。
現在擴展一下,Drools文檔實際上是相當不錯的,只有一小部分,所以我將嘗試僅關注一些主要主題。
首先,我需要做一些事情以使規則能夠使用maven從您的測試中運行,默認情況下,.drls不在類路徑中,一種簡單的解決方法是將以下內容添加到POM中:
<build><resources><resource><directory>src/main/rules</directory></resource></resources> </build>現在,更多規則場景和用法:
集合:
查詢a的內容可以通過2種方式完成,contains和memberOf,區別在于與memberOf一起使用的集合必須是變量。
DRL:
rule "Use a Collection"when$vo : RoolVO( listValue contains "items" )then $vo.setStringValue("Done.");logger.log(Level.INFO,"Used a collection"); end 常用表達:
您還可以將正則表達式與關鍵字Matches和Not Matches一起用作選擇條件。
DRL:
rule "Use a Regular Expression"when$vo : RoolVO( stringValue matches "(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d)")then $vo.setStringValue("Done.");logger.log(Level.INFO,"Found the date with a regular expression dd/mm/yyyy"); end 全局變量:
您可以定義全局變量,不應在代碼中有時使用它們,以在方法之間或在這種情況下在規則之間傳遞信息。 而是應使用它們來提供規則使用的數據或服務。 一個示例可能是某個特定于應用程序的記錄器,或者可能是在應用程序啟動時加載的恒定查找數據。
考試:
public class TestBasicRules {private KnowledgeBase kbase;private Logger javaLogger = Logger.getLogger("testLogger");@Testpublic void testGlobal() {StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();RoolVO vo = new RoolVO();vo.setStringValue("Global");ksession.insert(vo);ksession.setGlobal("logger", javaLogger);ksession.fireAllRules();checkDone(ksession); }DRL:
package javaitzen.drools.rulesimport javaitzen.drools.RoolVO import java.util.logging.Levelglobal java.util.logging.Logger logger;rule "Use a Global "when$vo : RoolVO( stringValue == "Global")then $vo.setStringValue("Done.");logger.log(Level.INFO,"Logging with a global"); end 規則屬性:
根據規則,您可以指定屬性,其中有許多。 我只會提到幾個方便的例子(引用官方文檔):
無環
默認值:false
類型:布爾型 當規則的結果修改了事實后,可能導致規則再次激活,從而導致遞歸。 將no-loop設置為true意味著將忽略為當前數據集創建激活的嘗試。
顯著性
默認值:0
類型:整數 顯著性是一種優先級形式,在激活隊列中對具有較高顯著性值的規則進行排序時,將賦予它們較高的優先級。
方言
默認值:由程序包指定
類型:字符串 可能的值:“ java”或“ mvel” 該方言在LHS或RHS代碼塊中的任何代碼表達式中都使用了該語言。 當前有兩種方言可用,Java和MVEL。 雖然可以在包級別指定方言,但此屬性允許包定義被規則覆蓋。
生效日期
默認值:不適用
類型:字符串,包含日期和時間定義 僅當當前日期和時間在日期有效屬性之后時,規則才能激活。
日期過期
默認值:不適用
類型:字符串,包含日期和時間定義 如果當前日期和時間在date-expires屬性之后,則無法激活規則。
指導規則:
指導性規則編輯器似乎允許您在代碼中可以做的所有事情,無論是視覺上還是對于那些非開發人員而言都可能更直觀。 唯一需要做的就是確保將要使用的對象導入到.package中與創建的.brl文件相同的位置。
決策表:
我認為世界實際上是在電子表格上運行的。 我們都喜歡認為它僅是因為我們和我們的高級應用程序才起作用,但事實是,與任何其他單個應用程序相比,全世界都將錯失電子表格。
滿足我們需求的業務人員了解電子表格,其中一些表格比我們的開發人員更好,這是決策表上最大的一筆獎勵。 乍一看,Drools決策表看上去確實不像Quickrules那樣簡單地交付給業務用戶,但實際上它被清晰地分為“代碼”和“數據”。
現在將決策表分解為各個部分……
在創建決策表時,eclipse插件為您提供了一個示例,我將通過該示例進行工作。
C2:關鍵字規則集,僅說明此電子表格是一個規則集(程序包)。
D2:規則集(程序包)名稱。
在此行下,您可以指定以下可選關鍵字: 順序的–右邊的單元格可以為true或false。 如果為true,則使用顯著性來確保規則從上到下觸發。 導入–右側的單元格包含要導入的類的逗號分隔列表。 變量–右邊的單元格可以包含Drools支持的全局聲明。 這是一種類型,后跟一個變量名。 (如果需要多個變量,請用逗號分隔)。
C3 / D4:注釋標題和實際注釋。
C5:RuleTable關鍵字和名稱。 “ RuleTable”關鍵字必須出現在第一個條件列的頂部。 您可以在工作表上有多個規則表,它們必須僅由一行分隔。
C6:將列標記為CONDITION列,G6,為ACTION執行此操作。 您需要至少一個表才有效。 如果“條件”列中沒有數據,則該條件不適用。
其他列可選關鍵字是:
優先級–這表明該列的值將設置顯著性 持續時間–這將設置規則行的持續時間值。 NO-LOOP –與drl中的相同,它指定是否不允許循環規則。
C7:該行中的此列和后續列定義規則表中引用的實際變量。
C8:行中的此列和后續列指定我們從何處獲取數據。
第9行和B列只是標簽/標題,使數據更易于理解,可以隱藏所有其他字段和列,以免嚇到“技術含量較低”的人。 然后,B9內的表就是非開發人員定義的特定規則數據,希望直接從規范中定義。
我已經將此項目上載到我的Google代碼項目中,以防有人需要。 我的決策表有一個小問題,因為我是在家里而不是在Microsoft Office上運行OpenOffice,該插件需要Excel,因此它在我的項目中留下了一個難看的紅色X,但是它在IDE外部可以很好地打開,并且仍然可以在Maven中進行編譯。
在下一篇文章中,我將看一看“規則流”,然后開始處理古弗諾爾怪獸
參考: 學習流口水……第1部分和學習流口水……第2部分,來自我們的JCG合作伙伴 ? Zen博客中的Zen領域的 Brian Du Preez。
翻譯自: https://www.javacodegeeks.com/2012/02/jboss-drools-getting-started.html
jboss drools
總結
以上是生活随笔為你收集整理的jboss drools_JBoss Drools –入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 11寸多大 11寸屏幕的尺寸是怎么计算出
- 下一篇: AI 识别能力超过人眼,仅凭照片,就能快