小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Drools規(guī)則引擎介紹一 / 藍(lán)訊

 邵飛翔 2018-03-07

原文地址:http://docs./drools/release/6.2.0.Final/drools-docs/html_single/index.html 

原文前面所有的步驟都可以省略,直接從安裝eclipse插件開(kāi)始,安裝地址是:http://docs./drools/release/6.2.0.Final/drools-docs/html_single/index.html

在國(guó)內(nèi)現(xiàn)在是可以直接update,所以不需要用zip安裝之類的方法。

在eclipse的Preferences中出現(xiàn)了一個(gè)菜單Drools,在installed Drools里面add一個(gè)Runtime(選擇官網(wǎng)下載后解壓縮的binaries目錄)。

新建一個(gè)Drools Project

src/main/java新建類DroolsTest:

package com.sample;


import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;


/
 * This is a sample class to launch a rule.
 */
public class DroolsTest {


    public static final void main(String[] args) {
        try {
            // load up the knowledge base
       KieServices ks = KieServices.Factory.get();
       KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");


            // go !
            Message message = new Message();
            message.setMessage("Hello World");
            message.setStatus(Message.HELLO);
            kSession.insert(message);
            kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }


    public static class Message {


        public static final int HELLO = 0;
        public static final int GOODBYE = 1;


        private String message;


        private int status;


        public String getMessage() {
            return this.message;
        }


        public void setMessage(String message) {
            this.message = message;
        }


        public int getStatus() {
            return this.status;
        }


        public void setStatus(int status) {
            this.status = status;
        }


    }


}



src/main/resources/rules新建規(guī)則文件

package com.sample
 
import com.sample.DroolsTest.Message;
 
rule "Hello World"
    when
        m : Message( status == Message.HELLO, myMessage : message )
    then
        System.out.println( myMessage );
        m.setMessage( "Goodbye cruel world" );
        m.setStatus( Message.GOODBYE );
        update( m );
end


rule "GoodBye"
    when
        Message( status == Message.GOODBYE, myMessage : message )
    then
        System.out.println( myMessage );
end


src/main/resources/META-INF新建配置文件kmodule.xml:

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http:///kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>


點(diǎn)擊run可以看到結(jié)果:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www./codes.html#StaticLoggerBinder for further details.
Hello World
Goodbye cruel world

講解一下這個(gè)例子的邏輯:main函數(shù)前三行是固定寫法,它加載"ksession-rules"。這個(gè)名字在kmodule.xml里面配置,它會(huì)在resources目錄下的rules目錄下去找規(guī)則。

main函數(shù)先寫一個(gè)類型為Message.HELLO類型的消息到對(duì)象中,規(guī)則文件中規(guī)定如果類型為Message.HELLO則打印出消息并且更新對(duì)象類型Message.GOODBYE,

因?yàn)閡pdate(m)這時(shí)候規(guī)則引擎將會(huì)被再次觸發(fā),因?yàn)轭愋透聻镸essage.GOODBYE將會(huì)觸發(fā)規(guī)則2,打印出新類型的消息。


怎么樣在Maven中使用Drools:

drools在maven中央倉(cāng)庫(kù)中就有,所以不需要配置額外的maven倉(cāng)庫(kù),配置如下:

    <dependencies>
      <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-bom</artifactId>
        <type>pom</type>
        <version>...</version>
        <scope>import</scope>
      </dependency>
      ...
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.kie</groupId>
      <artifactId>kie-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <scope>runtime</scope>
    </dependency>
    ...
  <dependencies>



運(yùn)行時(shí):

這里說(shuō)的運(yùn)行時(shí)是指:如果你部署二進(jìn)制形式的規(guī)則(KnowledgePackage對(duì)象或者KnowledgeBase對(duì)象),這樣可以讓你的運(yùn)行時(shí)非常輕量化??梢杂胐rools-compiler來(lái)生成規(guī)則包然后把它們部署到運(yùn)行時(shí)環(huán)境。運(yùn)行時(shí)環(huán)境只需要drool-core.jar和knowledge-api.jar來(lái)運(yùn)行。

Rule Workbench(規(guī)則工作臺(tái))

需要Eclipse3.4以上(GEF插件3.4以上)

要不然就是用JBoss的IDE,集成好了。

通過(guò)http://www./drools/downloads.html 鏈接找到對(duì)應(yīng)的Drools plug-in安裝地址。

Drools運(yùn)行時(shí):

這里的運(yùn)行時(shí)表示的是jar包集合,其實(shí)就是下載的不同版本的Drools。Eclipse需要一個(gè)默認(rèn)的的Drools運(yùn)行時(shí)。

從源代碼構(gòu)建Drools:

Drools和jBPM使用Git來(lái)做版本控制。鏈接為:https://github.com/droolsjbpm

比如guvnor子項(xiàng)目,build方法如下:

$ git clone git@github.com:droolsjbpm/guvnor.git
...
$ cd guvnor
$ mvn clean install -DskipTests -Dfull
...
從6.0開(kāi)始KIE,Drools(包括工作臺(tái)),jBPM(包括設(shè)計(jì)器和控制臺(tái)),OptaPlanner將共享相同的版本號(hào)。

KIE是什么?

KIE是一個(gè)被Drools和jBPM共享的底層庫(kù),它提供一個(gè)統(tǒng)一的基本方法、編程模型來(lái)構(gòu)建,部署且提供了工具集。

KIE的結(jié)構(gòu):

Drools規(guī)則引擎介紹一


OptaPlanner是一個(gè)本地搜索和優(yōu)化工具,它現(xiàn)在是一個(gè)和Drools和jBPM同樣的頂級(jí)項(xiàng)目。

Dashboard Builder是一個(gè)強(qiáng)大的報(bào)表工具。它獨(dú)立于Drools和jBPM。

UberFire是工作臺(tái)項(xiàng)目的基礎(chǔ)組件,他提供了類似Eclipse樣式的工作臺(tái)能力(比如插件)。它也是獨(dú)立于Drools和jBPM。

Guvnor在5.0里面承擔(dān)了太多的職責(zé)。在6.0里面它將專注于封裝UberFire插件用戶構(gòu)建web的IDE。

Drools和jBPM工作臺(tái)的發(fā)行版本使用UberFire作為基礎(chǔ)然后加上一些插件Guvnor以及Drools、jBPM自己的插件像decision table,guided editor,BPMN2 designer,human task。


KIE的生命周期

編輯

用可視化工具例如DRL BPMN2,decision table, class models等 編輯知識(shí)庫(kù)(knowledge)

構(gòu)建

把上一步編輯的知識(shí)庫(kù)構(gòu)建為部署單元,對(duì)于KIE這個(gè)部署單元就是jar。

測(cè)試

把jar部署到應(yīng)用前請(qǐng)測(cè)試

部署

把jar部署到一個(gè)應(yīng)用可以使用的位置

KIE使用maven風(fēng)格的倉(cāng)庫(kù)

使用(Utilize)

加載jar然后提供一個(gè)KieSession對(duì)象,這樣應(yīng)用就可以和它交互了。

運(yùn)行

系統(tǒng)通過(guò)KieSession的API和它交互

工作

用戶通過(guò)UI或者命令行調(diào)用到它

管理

管理所有的KIESession或者KIEContainer


構(gòu)建,部署,使用和運(yùn)行

6.0引入了一個(gè)新配合和方法來(lái)build知識(shí)庫(kù),而5.0是用編程的方式,當(dāng)然這個(gè)編程的方式為了向后兼容還是可用的。

KIE項(xiàng)目或者模塊其實(shí)就是一個(gè)Maven的項(xiàng)目或者模塊,僅僅在META-INF目錄下面多了一個(gè)kmodule.xml。這個(gè)文件是用來(lái)描述選擇那些知識(shí)庫(kù)和配置知識(shí)庫(kù)的session。它可以通過(guò)spring或者OSGI BluePrints來(lái)提供xml支持。


雖然maven可以構(gòu)建和部署KIE項(xiàng)目,但有個(gè)插件,它會(huì)生成很多類文件,可以提供校驗(yàn)功能并且運(yùn)行速度會(huì)更快。

示例圖:

Drools規(guī)則引擎介紹一


org.kie.api.core.builder內(nèi)容

Drools規(guī)則引擎介紹一

KieContainer

Drools規(guī)則引擎介紹一

Example 4.2. 創(chuàng)建KieContainer



Example 4.3. kmodule.xml中配置KieBase示例


Table 4.1. kbase 屬性

Attribute name Default value Admitted values Meaning
name none any The name with which retrieve this KieBase from the KieContainer. This is the only mandatory attribute.
includes none any comma separated list A comma separated list of other KieBases contained in this kmodule. The artifacts of all these KieBases will be also included in this one.
packages all any comma separated list By default all the Drools artifacts under the resources folder, at any level, are included into the KieBase. This attribute allows to limit the artifacts that will be compiled in this KieBase to only the ones belonging to the list of packages.
default false true, false Defines if this KieBase is the default one for this module, so it can be created from the KieContainer without passing any name to it. There can be at most one default KieBase in each module.
equalsBehavior identity identity, equality Defines the behavior of Drools when a new fact is inserted into the Working Memory. With identity it always create a new FactHandle unless the same object isn't already present in the Working Memory, while with equality only if the newly inserted object is not equal (according to its equal method) to an already existing fact.
eventProcessingMode cloud cloud, stream When compiled in cloud mode the KieBase treats events as normal facts, while in stream mode allow temporal reasoning on them.
declarativeAgenda disabled disabled, enabled Defines if the Declarative Agenda is enabled or not.

Example 4.4. 從KieContainer中解析出KieBases 和 KieSessions 


因?yàn)镵Session2_1 和 KSession2_2 是不同的類型,一個(gè)是stateful,一個(gè)是stateless。所以他們使用的方法是不同的,如果用錯(cuò)了會(huì)拋出RunTimeException。


使用Maven來(lái)構(gòu)建

KIE插件使得artifact會(huì)被校驗(yàn)和預(yù)編譯,所以建議一直使用這個(gè)插件。如下圖

Example 4.7. 在pom.xml中增加KIE plugin 


用程序來(lái)定義KieModule

其實(shí)也可以用程序來(lái)定義KieModule里面的KieBase和KieSession。要做到這一點(diǎn)需要先創(chuàng)建一個(gè)KieFileSystem。它是一個(gè)虛擬的文件系統(tǒng),然后把項(xiàng)目中的所有資源添加進(jìn)去。

Drools規(guī)則引擎介紹一

像其他的核心組件一樣,你也可以從KieServices中獲取KieFileSystem。



Example 4.8. 用編程方式達(dá)到 kmodule.xml 同樣效果的例子


下面還要給KieFileSystem加上其他必須的artifacts:

Example 4.9. Adding Kie artifacts to a KieFileSystem



Example 4.10. Creating and adding a Resource with an explicit type



Example 4.11. Building the contents of a KieFileSystem and creating a KieContainer



Example 4.12. Checking that a compilation didn't produce any error



Example 4.13. Setting the severity using properties


4.2.3 部署

4.2.3.1 KieBase

KieBase是一個(gè)應(yīng)用的知識(shí)定義集合的倉(cāng)庫(kù)。它包含Rules,processes,functions和type models。KieBase本身不包含任何數(shù)據(jù)。由KieBase創(chuàng)建的Session可以用來(lái)插入數(shù)據(jù),然后用Session來(lái)啟動(dòng)進(jìn)程實(shí)例。KieBase可以從KieContainer(包含了KieModule)中取到。


有時(shí)候,在OSGI環(huán)境中,KieBase需要解析不在默認(rèn)類加載器中定義的類型。這時(shí)候就需要KieBaseConfiguration,它有一個(gè)額外的類加載器,當(dāng)KieContainer創(chuàng)建KieBase的時(shí)候可以傳遞給它。

Example 4.14. Creating a new KieBase with a custom ClassLoader


4.2.3.2 KieSession和 KieBase修改

KieSession會(huì)在“運(yùn)行”章節(jié)詳細(xì)討論。KieBase創(chuàng)建了KieSession對(duì)象并且保持了引用。當(dāng)修改KieBase的時(shí)候這些改動(dòng)也會(huì)被應(yīng)用到KieSession中。這個(gè)引用默認(rèn)是一個(gè)Java弱引用。當(dāng)然有一個(gè)可選的boolean參數(shù)可以控制這個(gè)引用。

4.2.3.3 KieScanner

KieScanner 可以持續(xù)監(jiān)控你的Maven Repository(不同于普通的maven)看看有沒(méi)有一個(gè)新的Kie項(xiàng)目被安裝。一個(gè)包含這個(gè)Kie項(xiàng)目的新的發(fā)布版本會(huì)被發(fā)布KieContainer中。KieScanner需要依賴kie-ci.jar包。


下面的例子顯示KieScanner怎么注冊(cè)到KieContainer的:

Example 4.15. Registering and starting a KieScanner on a KieContainer

在上面的例子里KieScanner被配置為按固定時(shí)間間隔啟動(dòng)。也可以調(diào)用scanNow()函數(shù)啟動(dòng)。如果KieScanner發(fā)現(xiàn)maven倉(cāng)庫(kù)中有KieContainer用到的新版本項(xiàng)目,它會(huì)自動(dòng)下載新版本并觸發(fā)一個(gè)增量構(gòu)建。這時(shí)候KieContainer中的所有KieBase和KieSession都更新為新版本了。

KieScanner只會(huì)選擇SNAPSHOT,版本范圍,或者LATEST設(shè)置中的修改。運(yùn)行時(shí)指定了版本號(hào),則不會(huì)被更新。


4.2.3.4 Maven的版本號(hào)和依賴

Maven有一些機(jī)制可以來(lái)管理版本號(hào)和應(yīng)用。應(yīng)用可以指定版本發(fā)布?;騽t使用SNAPSHOT發(fā)布??梢酝ㄟ^(guò)提供特定范圍的版本號(hào)或者使用SNAPSHOT機(jī)制。

StackOverFlow網(wǎng)站提供了一個(gè)非常好的解釋:

http:///questions/30571/how-do-i-tell-maven-to-use-the-latest-version-of-a-dependency 

如果你總是要使用最新版本,Maven有兩個(gè)重點(diǎn)可以用而不用使用版本范圍這個(gè)方法。你需要小心使用這些參數(shù)因?yàn)槟阋呀?jīng)不再控制這些插件和依賴關(guān)系。

當(dāng)你依賴一個(gè)插件或者依賴,你可以再version字段使用LATEST或者RELEASE。LATEST表示最新的發(fā)布版本或者SNAPSHOT版本。RELEASE表示最新的RELEASE版本,不包含SNAPSHOT版本??偠灾詈貌灰辉O(shè)定具體的版本。廢話省略。

詳情請(qǐng)看Maven的POM的語(yǔ)法描述:

http://books./mvnref-book/reference/pom-relationships-sect-pom-syntax.html

http://books./mvnref-book/reference/pom-relationships-sect-project-dependencies.html


下面是一個(gè)例子:


顯示申明一個(gè)版本(除非版本沖突,否則總是這個(gè)版本):


(廢話不詳說(shuō))

4.2.3.5 Settings.xml和遠(yuǎn)程倉(cāng)庫(kù)安裝:

(廢話不詳說(shuō))


4.2.4 運(yùn)行

4.2.4.1 KieBase

KieBase是應(yīng)用知識(shí)庫(kù)。它包含規(guī)則,processes,函數(shù),和類型模型。KieBase本身不包含任何數(shù)據(jù)。從KieBase中創(chuàng)建的session可以被插入數(shù)據(jù),可以從session中創(chuàng)建processes。當(dāng)KieBase定義的時(shí)候,KieBase可以從KieContainer中包含的KieModels中獲取。


Example 4.16. Getting a KieBase from a KieContainer

4.2.4.2 KieSession

KieSession保存和執(zhí)行運(yùn)行時(shí)數(shù)據(jù)。它是從KieBase中創(chuàng)建。


4.2.4.3 Kie運(yùn)行時(shí)

kie運(yùn)行時(shí)給Rules,processes提供全局設(shè)置、注冊(cè)channel等方法。


4.2.4.3.1.1 Globals(全局對(duì)象)

規(guī)則引擎可以看到Globals命名對(duì)象。但是改變Globals里面的值不會(huì)重算Rules。Globals再提供靜態(tài)信息方面很有效。比如在規(guī)則的RHS中提供服務(wù)?;蛘呓邮諒囊?guī)則引擎返回的平均值。當(dāng)你在LHS中使用Globals的時(shí)候,保證它不可變,或者至少改變不會(huì)影響規(guī)則的行為。

global應(yīng)該如下定義:

global java.util.List list

廢話省略

4.2.4.4 事件模型

event包提供了規(guī)則引擎的事件,比如規(guī)則被觸發(fā)或者對(duì)象被斷言。這樣就可以從應(yīng)用的主流程中分離日志或者監(jiān)聽(tīng)事件。

KieRuntimeEventManager


RuleRuntimeEventManager




待續(xù)......

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多