drools 执行函数_Drools可执行模型还活着
drools 執(zhí)行函數(shù)
總覽
可執(zhí)行模型的目的是提供規(guī)則集的純基于Java的表示,以及方便的Java DSL以編程方式創(chuàng)建這種模型。 該模型是低級(jí)的,旨在為用戶提供所需的所有信息,例如用于索引評(píng)估的lambda。 這樣可以使其保持快速運(yùn)行,并避免在此級(jí)別上進(jìn)行過(guò)多的假設(shè)。 預(yù)計(jì)將來(lái)會(huì)有更高層次的表示形式出現(xiàn),這可能會(huì)更加注重最終用戶。 這項(xiàng)工作還高度補(bǔ)充了單元工作,它提供了一種面向Java的方式來(lái)提供數(shù)據(jù)和控制流程。
細(xì)節(jié)
該模型具有足夠的通用性,可以獨(dú)立于Drools,但可以編譯為一個(gè)普通的Drools知識(shí)庫(kù)。 因此,可執(zhí)行模型的實(shí)現(xiàn)已分為兩個(gè)子項(xiàng)目:
可執(zhí)行模型的引入在不同領(lǐng)域帶來(lái)了一系列好處:
- 編譯時(shí)間 :在Drools 6中,一個(gè)kjar包含了drl文件和其他Drools工件的列表,這些工件定義了規(guī)則庫(kù)以及一些實(shí)現(xiàn)約束和后果的預(yù)先生成的類。 從Maven存儲(chǔ)庫(kù)下載kjar并將其安裝在KieContainer中時(shí),需要從頭開(kāi)始解析和編譯這些drl文件,這使得此過(guò)程非常緩慢,尤其是對(duì)于大型規(guī)則集。 相反,現(xiàn)在可以在kjar中封裝實(shí)現(xiàn)項(xiàng)目規(guī)則庫(kù)的可執(zhí)行模型的Java類,并以更快的方式從中重新創(chuàng)建KieContainer及其KieBases。 kie-maven-plugin在編譯過(guò)程中會(huì)自動(dòng)從drl文件生成可執(zhí)行模型源。
- 運(yùn)行時(shí) :在可執(zhí)行模型中,所有約束都定義為Java Lambda表達(dá)式。 相同的lambda也用于約束評(píng)估,這可以避免使用mvel進(jìn)行解釋性評(píng)估,也無(wú)需使用吉特流程來(lái)轉(zhuǎn)換基于mvel的字節(jié)碼約束,從而導(dǎo)致預(yù)熱過(guò)程緩慢。
- 未來(lái)的研究 :可執(zhí)行模型將允許試驗(yàn)規(guī)則引擎的新功能,而無(wú)需以drl格式編碼它們并修改drl解析器以支持它們。
可執(zhí)行模型DSL
在為可執(zhí)行模型設(shè)計(jì)DSL的第一個(gè)迭代時(shí),一個(gè)目標(biāo)是擺脫模式的概念,并將規(guī)則視為表達(dá)式(約束)和動(dòng)作(結(jié)果)的流。 因此,我們將其稱為Flow DSL。 此DSL的一些示例在此處提供 。
但是,在實(shí)施Flow DSL之后,很明顯,避免顯式使用模式的決定使我們不得不實(shí)施一些既具有復(fù)雜性又具有性能成本的額外邏輯 ,因?yàn)闉榱苏_地重新創(chuàng)建模型期望的數(shù)據(jù)結(jié)構(gòu), Drools編譯器有必要將那些看似無(wú)關(guān)的表達(dá)式組合在一起。
因此,已經(jīng)決定在第二個(gè)DSL中重新引入模式,我們稱之為模式DSL 。 這允許繞過(guò)該算法將必須填充人為的語(yǔ)義空白的表達(dá)式分組,并且在運(yùn)行時(shí)也很耗時(shí)。
我們認(rèn)為兩種DSL都適用于不同的用例,然后我們決定保留并支持這兩種。 特別是Pattern DSL更安全,更快速(即使更冗長(zhǎng)),因此這是在通過(guò)kie-maven-plugin創(chuàng)建kjar時(shí)將自動(dòng)生成的DSL。 相反,Flow DSL更為簡(jiǎn)潔,更接近于用戶希望以編程方式定義Java規(guī)則的方式,我們計(jì)劃通過(guò)后處理器自動(dòng)生成定義模型的模型部分,從而使其不再那么冗長(zhǎng)。索引和屬性React性。 換句話說(shuō),我們期望模式DSL將由機(jī)器編寫(xiě),流DSL最終將由人編寫(xiě)。
程序化構(gòu)建
如上一節(jié)中鏈接的測(cè)試用例所證明的那樣,可以用Java以編程方式定義一個(gè)或多個(gè)規(guī)則,然后使用流暢的API將它們添加到模型中。
Model model = new ModelImpl().addRule( rule );一旦有了這個(gè)模型,該模型完全獨(dú)立于Drools算法和數(shù)據(jù)結(jié)構(gòu),便可以按照以下方法創(chuàng)建一個(gè)KieBase
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel( model );或者,也可以通過(guò)從普通的drl文件開(kāi)始將其創(chuàng)建為基于可執(zhí)行模型的kieproject,并像往常一樣將它們添加到KieFileSystem中。
KieServices ks = KieServices.Factory.get(); KieFileSystem kfs = ks.newKieFileSystem().write( "src/main/resources/r1.drl", createDrl( "R1" ) ); KieBuilder kieBuilder = ks.newKieBuilder( kfs );然后使用新的buildAll()方法重載來(lái)構(gòu)建項(xiàng)目,該方法接受一個(gè)類,該類指定要構(gòu)建的項(xiàng)目類型
kieBuilder.buildAll( ExecutableModelProject.class );這樣做,KieBuilder將生成可執(zhí)行模型(基于Pattern DSL),然后生成結(jié)果KieSession
KieSession ksession = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()).newKieSession();如本文檔第一部分所述,它將與基于lambda表達(dá)式的約束一起使用。 同樣,通過(guò)將不同的項(xiàng)目類傳遞給KieBuilder,也可以從Flow DSL生成可執(zhí)行模型。
kieBuilder.buildAll( ExecutableModelFlowProject.class );但是,對(duì)于討論2種不同DSL時(shí)所解釋的內(nèi)容,為此目的最好使用基于模式的。
Kie Maven插件
為了使用kie-maven-plugin生成嵌入可執(zhí)行模型的kjar,有必要在pom.xml文件中添加與實(shí)現(xiàn)模型及其編譯器的兩個(gè)先前提到的項(xiàng)目相關(guān)的依賴項(xiàng):
<dependencies><dependency><groupId>org.drools</groupId><artifactId>drools-model-compiler</artifactId></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-canonical-model</artifactId></dependency> </dependencies>還將插件添加到插件部分
<build><plugins><plugin><groupId>org.kie</groupId><artifactId>kie-maven-plugin</artifactId><version>${project.version}</version><extensions>true</extensions></plugin></plugins> </build>這里提供了已經(jīng)準(zhǔn)備好生成可執(zhí)行模型的pom.xml文件的示例。 默認(rèn)情況下,kie-maven-plugin仍會(huì)生成基于drl的kjar,因此必須使用以下參數(shù)運(yùn)行插件:
-DgenerateModel=<VALUE>其中<VALUE>可以是三個(gè)值之一:
YES NO WITHDRLYES和WITHDRL都將使用實(shí)現(xiàn)與原始項(xiàng)目中的drl文件相對(duì)應(yīng)的可執(zhí)行模型的Java類來(lái)生成Java并將其添加到kjar,不同之處在于第一個(gè)將從生成的kjar中排除drl文件,而第二個(gè)還將添加它們。 但是,在第二種情況下,由于無(wú)論如何,KieBase都是從可執(zhí)行模型構(gòu)建的,因此drl文件將僅起文檔作用。
未來(lái)發(fā)展
如預(yù)期的那樣,下一個(gè)目標(biāo)是使DSL(尤其是流量)更加用戶友好,尤其是使用后處理器生成可以自動(dòng)推斷的所有部分,例如與索引和屬性React性有關(guān)的部分。
從可執(zhí)行模型的角度來(lái)看,我們特別通過(guò)在規(guī)則單元上完成的工作改進(jìn)了規(guī)則的模塊化和編排。圍繞pojo-ification的重點(diǎn)補(bǔ)充了圍繞純Java DSL的研究方向,并且我們已經(jīng)有了一些簡(jiǎn)單的示例 , 說(shuō)明了如何將可執(zhí)行模型和規(guī)則單元可以混合使用。
翻譯自: https://www.javacodegeeks.com/2018/02/drools-executable-model-alive.html
drools 執(zhí)行函數(shù)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的drools 执行函数_Drools可执行模型还活着的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在各个网吧通用免费上网的方法在各个网吧通
- 下一篇: rabbitmq 传递文件_使用Rabb