規則引擎drools的簡單使用

來源:互聯網
上載者:User

標籤:string   dep   stat   errors   pac   依賴   mave   bye   author   

規則引擎適用於有複雜多變的規則,如商品滿減、積分贈送、考勤規則等

一、引入maven依賴

<dependency>    <groupId>org.drools</groupId>    <artifactId>drools-core</artifactId>    <version>7.13.0.Final</version></dependency><dependency>    <groupId>org.drools</groupId>    <artifactId>drools-compiler</artifactId>    <version>7.13.0.Final</version></dependency>

  

二、drools有兩種執行方式,第一種是基於kmodule.xml、drl設定檔,第二種是動態讀取規則

基於kmodule方式

 1)建立Fact,drools中的Fact即是java中的普通的bean,用於傳遞參數

package com.beyond.odc.entity;/** * Fact java bean * @author Hejinsheng */public class Message {    private String message;    private String result;    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;    }    public String getResult() {        return result;    }    public void setResult(String result) {        this.result = result;    }}

  

 2)在resources/META-INF下建立kmodule.xml檔案,內容如下

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

  

3)在resources/rules檔案夾下建立規則描述檔案rules.drl,內容如下

package rulesimport com.beyond.odc.entity.Message;rule "hello"    no-loop true    lock-on-active true    when        $message:Message(status==0)    then        System.out.println("訊息:"+$message.getMessage());        $message.setResult("hello 響應的訊息");        update($message)endrule "byebye"    no-loop true    lock-on-active true    when        $message:Message(status==1)    then        System.out.println("訊息:"+$message.getMessage());        $message.setResult("byebye 響應的訊息");        update($message)end

  

 4)編寫測試檔案

public static void main(String[] args) {       try {            KieSession kSession = KieContainerFactory.getKieContainer().newKieSession("ksession-rules");            Message message = new Message();            message.setMessage("hello");    // 對應drl檔案中的rule name,表示要執行的規則            message.setStatus(0);           // 取message中的某個欄位,使用者規則檔案中的判斷是否執行代碼塊            kSession.insert(message);       // 將message作為傳遞的參數傳入drools執行            kSession.fireAllRules();        // 載入規則            System.out.println("從drools中接收到的訊息:"+message.getResult());    // drools中如果有參數響應,可以通過欄位擷取        } catch (Throwable t) {            t.printStackTrace();        }}

  

//KieContainerFactory程式碼片段public class KieContainerFactory {    private static KieContainer kieContainer;    public static KieContainer getKieContainer() {        if(kieContainer == null){            // load up the knowledge base            KieServices ks = KieServices.Factory.get();            KieContainer kContainer = ks.getKieClasspathContainer();            kieContainer = kContainer;        }        return kieContainer;    }}

  

5)執行結果,說明代碼已經執行到drools檔案中,具體的商務邏輯可以在then後的代碼塊中實現

進來了,訊息:hello從drools中接收到的訊息:hello 響應的訊息

  

三、動態方式執行

一般指從資料庫或者遠程擷取的規則描述資訊,進行規則執行。動態方式不需要kmodule.xml和drl檔案,執行上更加簡單

public static void execFromDB(){        KieSession kSession = null;        try {            // 實際情況從資料庫根據code查規則,這裡類比寫死            String rule = "package rules\n" +                    "\n" +                    "import com.beyond.odc.entity.Message;\n" +                    "\n" +                    "rule \"hello\"\n" +                    "    no-loop true\n" +                    "    lock-on-active true\n" +                    "    when\n" +                    "        $message:Message(status==0)\n" +                    "    then\n" +                    "        System.out.println(\"動態執行,訊息:\"+$message.getMessage());\n" +                    "        $message.setResult(\"hello 響應的訊息\");\n" +                    "        update($message)\n" +                    "end\n" +                    "\n" +                    "rule \"byebye\"\n" +                    "    no-loop true\n" +                    "    lock-on-active true\n" +                    "    when\n" +                    "        $message:Message(status==1)\n" +                    "    then\n" +                    "        System.out.println(\"動態執行,訊息:\"+$message.getMessage());\n" +                    "        $message.setResult(\"byebye 響應的訊息\");\n" +                    "        update($message)\n" +                    "end";            KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();            kb.add(ResourceFactory.newByteArrayResource(rule.getBytes("utf-8")), ResourceType.DRL);            // 檢查規則正確性            KnowledgeBuilderErrors errors = kb.getErrors();            for (KnowledgeBuilderError error : errors) {                System.out.println("規則檔案正確性有誤:{}" + error);            }            InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();            kBase.addPackages(kb.getKnowledgePackages());            // 執行規則            kSession = kBase.newKieSession();            // fact            Message fact = new Message();            fact.setMessage("byebye");            fact.setStatus(1);            kSession.insert(fact);            kSession.fireAllRules();            System.out.println("從drools規則中接收到的訊息:"+fact.getResult());        } catch (Exception e) {            System.out.println("規則執行異常:{}"+e);        } finally {            if (null != kSession)                kSession.dispose();        }    }

  執行結果如下:

動態執行,訊息:byebye從drools規則中接收到的訊息:byebye 響應的訊息

  

 

規則引擎drools的簡單使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.