当前位置:文档之家› Drools规则引擎开发说明

Drools规则引擎开发说明

Drools 规则动态更新
在常规开发方式中,如果涉及规则的变更(比如将物流费用从 6 元调整为 8 元),可以通过重 新完成规则的开发并发布应用来更新。或在设计上,将可能变更的规则以配置(比如数据库) 方式管理。发生规则变更时,只需修改配置即可。事实上,Drools 提供了另一种规则更新 的方式 -- 扫描 Maven 仓库(本地或远程)来自动发现规则模块的更新。 我们知道,Drools 可以利用 KieServices 来创建基于 classpath 的 KieContainer(即使用 KieServices.newKieClasspathContainer()方法)。其实,KieServices 还提供了从 Maven 仓库加载并创建 KieContainer 的方法 -- newKieContainer(ReleaseId)。与通过 classpath 创 建 KieContainer 类 似, 使 用 Maven 仓 库加 载 的 方法 , 会尝 试 读 取对 应 jar 包 中的 META-INF/kmodule.xml 文件,基于此,我们可以完成 KieSession 的创建。 我们通过一个简单的例子来观察规则的动态更新。在这个例子中,我们会将商品的折扣进行 动态调整。我们需要构建规则,并安装到 Maven 仓库中 -- 简单起见,我们将应用发布到本 地 Maven 仓库中。首先,我们创建一个 Maven 项目: $ mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.sharp.rules -DartifactId=discount
如果没什么问题,我们可以得到一个名为 discount 的文件夹,其中的 pom.xml 看起来像这 样:
<project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.sharp.rules</groupId> <artifactId>discount</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>discount</name> <url></url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
<ksession name="rules.discount.default" /> </kbase> </kmodule>
由 于 , kbase 的 name 属 性 被 配 置 为 了 rules.discount 。 我 们 在 src/main/resources/META-INF 下,创建 rules/discount 文件夹,并在 discount 文件夹中 添加如下规则文件: package com.sharp.rules.discount
</project>
在 src/main/java/com/sharp/rules 下创建 Fact 类:
package com.sharp.rules;
public class Commodity { private double discount;
public void setDiscount(double discount) { this.discount = discount;
}
public double getDiscount() { return this.discount;
} }
这 个 类 很 简 单 , 只 包 含 一 个 discount 属 性 。 接 下 来 看 一 看 规 则 。 首 先 在 src/main/resources(若 resources 文件夹不存在,先创建它) 下创建 META-INF 文件夹,并 在 META-INF 中新建 kmodule.xml,并填入如下内容:
<?xml version="1.0" encoding="UTF-8" ?> <kmodule xmlns="/xsd/kmodule"
xmlns:xsi="/2001/XMLSchema-instance"> <kbase name="rules.discount">
import modity
rule "Set all commodities' discount - no limit" no-loop when $c: Commodity() then modify($c) { setDiscount(0.15) };
endLeabharlann 这条规则将所有的商品的折扣都设置为 15%。这里先略掉对这个项目的测试,而直接将发布 到本地的 Maven 仓库: $ mvn install
...
Installing
/path/to/project/discount/target/discount-1.0-SNAPSHOT.jar
to
/path/to/local-maven-repo/repository/com/sharp/rules/discount/1.0-SNAPSHOT/discount-1.0-SNAPSHOT.jar
相关主题