日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 规则引擎 drools_Drools 规则引擎环境搭建

發布時間:2023/12/10 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 规则引擎 drools_Drools 规则引擎环境搭建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、關于 drools 規則引擎

前面寫過一篇 Drools 規則引擎相關的文章,這篇文章主要記錄一下規則引擎的環境搭建和簡單示例。不熟悉 drools 的朋友可以看看這篇文章: 自己寫個 Drools 文件語法檢查工具——棧的應用之編譯器檢測語法錯誤

介紹的內容:

Drools 規則引擎的使用場景

Drools 規則引擎的優點

Drools的基本工作工程(Fact對象、Drl文件內容、Drools的基礎語法)

drools 文件的形式

Drools 文件語法初步檢查

二 、Drools 的環境搭建及簡單示例

環境: idea + jdk1.8 + gradle

我用的是 gradle 構建 java 工程的方式、用 maven 構建的可以參考配置

構造這樣一個需求背景,雙十一來了,商品打折,假設商品價格 (0,500], 打85折,商品價格 (500, 1000],打8折, 商品價格 (1000,∞), 一律減 300。

1. 創建項目

新建一個 gradle 項目,創建包:com.sharpcj,新建類 Product.java 和 Main.java:

Product.java 文件如下:

package com.sharpcj;

public class Product {

private String name; // 商品名稱

private double prePrice; // 商品定價

private double realPrice; //商品實際售價

public Product() {

}

public Product(String name, double prePrice) {

this.name = name;

this.prePrice = prePrice;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public double getPrePrice() {

return prePrice;

}

public void setPrePrice(double prePrice) {

this.prePrice = prePrice;

}

public double getRealPrice() {

return realPrice;

}

public void setRealPrice(double realPrice) {

this.realPrice = realPrice;

}

}

然后在 Main.java 新建 main 方法。

2. Gradle引入Drools庫

打開 build.gradle 文件,添加相應的插件和依賴

plugins {

id 'java'

}

plugins {

id 'application'

}

mainClassName = 'com.sharpcj.Main'

group 'com.sharpcj'

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {

mavenCentral()

}

dependencies {

testCompile group: 'junit', name: 'junit', version: '4.12'

compile group: 'org.kie', name: 'kie-api', version: '7.5.0.Final'

compile group: 'org.drools', name: 'drools-compiler', version: '7.5.0.Final'

}

引入 Java 插件,使Gradle可以構建Java代碼,同時引入了執行Drools依賴的兩個庫, 指定了 mainClassName。

3.編寫 drools 文件

在 resources 目錄下面新建包 demo.rules,用來存放 drools 規則文件。然后新建文件 product.drl,

內容如下:

package com.sharpcj;

rule "Product price less than 500" // 給規則取個名

when

pp : Product( prePrice <= 500 ) // 規則

then

// 符合規則后執行的操作,是Java代碼

double prePrice = pp.getPrePrice();

pp.setRealPrice(prePrice * 0.85);

System.out.println(pp.getName() + "活動價是:" + pp.getRealPrice());

end

rule "Product price less than 1000" // 給規則取個名

when

p : Product( prePrice > 500 && prePrice <=1000 ) // 規則

then

// 符合規則后執行的操作,是Java代碼

double prePrice = p.getPrePrice();

p.setRealPrice(prePrice * 0.8);

System.out.println(p.getName() + "活動價是:" + p.getRealPrice());

end

rule "Product price more than 1000" // 給規則取個名

when

p : Product( prePrice > 1000 ) // 規則

then

// 符合規則后執行的操作,是Java代碼

double prePrice = p.getPrePrice();

p.setRealPrice(prePrice - 300);

System.out.println(p.getName() + "活動價是:" + p.getRealPrice());

end

4.編寫配置文件

運行 drools 需要一個固定的配置文件,在 resources 文件下的目錄 META_INF,名稱固定為 kmodule.xml:

配置文件至少包含如下幾行:

配置簡單說明:

Kmodule中可以包含一個到多個kbase,分別對應drl的規則文件。

Kbase需要一個唯一的name,可以取任意字符串。

packages為drl文件所在resource目錄下的路徑。注意區分drl文件中的package與此處的package不一定相同。

多個包用逗號分隔。默認情況下會掃描resources目錄下所有(包含子目錄)規則文件。

kbase的default屬性,標示當前KieBase是不是默認的,如果是默認的則不用名稱就可以查找到該KieBase,但每個module最多只能有一個默認KieBase。

kbase下面可以有一個或多個ksession,ksession的name屬性必須設置,且必須唯一。

5.讓規則文件程序跑起來

在 Main.java 類中編寫測試方法,讓規則文件跑起來:

package com.sharpcj;

import org.kie.api.KieServices;

import org.kie.api.runtime.KieContainer;

import org.kie.api.runtime.KieSession;

public class Main {

public static void main(String[] args){

new Main().test();

}

private void test(){

// 構建KieServices

KieServices ks = KieServices.Factory.get();

KieContainer kc = ks.getKieClasspathContainer();

// 獲取kmodule.xml中配置中名稱為ksession-rule的session,默認為有狀態的。

KieSession kSession = kc.newKieSession("ksession1");

Product fan = new Product("電扇", 280);

Product washer = new Product("洗衣機",2200);

Product phone = new Product("手機", 998);

kSession.insert(fan);

kSession.insert(washer);

kSession.insert(phone);

kSession.fireAllRules();

kSession.dispose();

}

}

運行結果:

三、其它說明

1.不使用配置文件形式

上面使用的配置文件形式加載 drools 文件是 drools 7.x 版本才有的,在此之前,我們通常使用代碼形式加載規則文件,當然在 drools 7.x 中依然可以使用這種方式,只不過有些 API 已經過時了,或者更新了。下面用代碼形式加載規則文件代碼如下:

/**

* 不使用 drools 7.x 配置文件

*/

private void test2(){

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

kbuilder.add(ResourceFactory.newClassPathResource("demo/rules/product.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.");

}

// 注釋掉的是 drools 6.x API

/*KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();*/

// drools 7.x API

InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

Collection pkgs = kbuilder.getKnowledgePackages();

kbase.addPackages(pkgs);

KieSession kieSession = kbase.newKieSession();

Product fan = new Product("電扇", 280);

Product washer = new Product("洗衣機",2200);

Product phone = new Product("手機", 998);

kieSession.insert(fan);

kieSession.insert(washer);

kieSession.insert(phone);

kieSession.fireAllRules();

kieSession.dispose();

}

運行程序依然能得到相同的結果。

2.規則文件的類型

規則文件除了 drl 文件之類,還有其它類型的文件,如 xls, csv。

四、附錄

總結

以上是生活随笔為你收集整理的python 规则引擎 drools_Drools 规则引擎环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。