引用自[http://cutelion.blog.hexun.com/72268803_d.html]
开发环境: Drools 5.3.0, 必需的lib: drools-templates-5.3.0.Final.jar
在利用Drools 5编写规则时,如果发现有一组规则遵守相同布置的模式、约束和在RHS中的动作,只是
常量、对象或字段名字不同,可以考虑为产生实际的规则,启用Drools的规则模板功能。我们可以编写一个
规则模板文件,包含规则文字骨架,并使用Drools模板编译器,为实例规则的内容组合一个提供实际值的对
象集合。以下是一个简单的例子。
1. 新建一个java包,如 template
2. 在其中建枚举: ItemCode.java
package template;
public enum ItemCode {
LOCK, STOCK, BARREL
}
3. 建一个项目类 Item.java
package template;
public class Item {
private String name;
private int weight;
private ItemCode itemCode;
private int price;
public Item(String name, int price, int weight, ItemCode itemCode) {
super();
this.name = name;
this.price = price;
this.weight = weight;
this.itemCode = itemCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public ItemCode getItemCode() {
return itemCode;
}
public void setItemCode(ItemCode itemCode) {
this.itemCode = itemCode;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
4. 建一个参数集的类: ParamSet.java
package template;
import java.util.EnumSet;
public class ParamSet {
private String field;
private int lower;
private int upper;
private EnumSet<ItemCode> codeSet;
public ParamSet(String field, int lower, int upper,
EnumSet<ItemCode> codeSet) {
super();
this.field = field;
this.lower = lower;
this.upper = upper;
this.codeSet = codeSet;
}
public String getField() {
return field;
}
public int getLower() {
return lower;
}
public int getUpper() {
return upper;
}
public String getCodes() {
StringBuilder sb = new StringBuilder();
String conn = "";
for (ItemCode ic : codeSet) {
sb.append(conn).append(" == ItemCode.").append(ic);
conn = " ||";
}
return sb.toString();
}
}
5. 建一个规则展开器类,用于展开模板规则。Expander.java
package template;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Collection;
import org.drools.KnowledgeBase;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.template.ObjectDataCompiler;
public class Expander {
public void expand(KnowledgeBase kBase, InputStream is, Collection<?> act)
throws Exception {
ObjectDataCompiler converter = new ObjectDataCompiler();
String drl = converter.compile(act, is);
KnowledgeBuilder kBuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
Reader rdr = new StringReader(drl);
kBuilder.add(ResourceFactory.newReaderResource(rdr), ResourceType.DRL);
if (kBuilder.hasErrors()) {
for (KnowledgeBuilderError err : kBuilder.getErrors()) {
System.err.println(err.toString());
}
throw new IllegalStateException("DRL errors");
}
kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());
}
}
6. 建一个规则模板文件: Item.drl
template header
field
lower
upper
codes
package range;
import template.Item
import template.ItemCode
template "inRange"
rule "is in range @{row.rowNumber}"
when
Item($name : name, $v : @{field} >= @{lower} && <= @{upper}, $code : itemCode @{codes})
then
System.out.println("Item " + $name + " @{field} in range: " + $v + " itemCode: " + $code);
end
end template
说明: $code : itemCode @{codes} 中的 @{codes} 是应用的 getCodes()方法, 拼接了字符串形成一个带或(||)的逻辑表达式。也就是 Item.getCodes()这个方法。
7. 到这里就可以开始写测试代码了。TestItemTemplate.java
package template;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
public class TestItemTemplate {
public static void main(String args[]) throws Exception {
Collection<ParamSet> cfl = new ArrayList<ParamSet>();
cfl.add(new ParamSet("price", 10, 50, EnumSet.of(ItemCode.BARREL)));
cfl.add(new ParamSet("weight", 10, 99, EnumSet.of(ItemCode.LOCK,ItemCode.STOCK)));
KnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
Expander ex = new Expander();
InputStream dis = ResourceFactory.newClassPathResource("template/Item.drl", TestItemTemplate.class).getInputStream();
ex.expand(kBase, dis, cfl);
StatefulKnowledgeSession session = kBase.newStatefulKnowledgeSession();
session.insert(new Item("A", 130, 42, ItemCode.LOCK));
session.insert(new Item("B", 44, 140, ItemCode.STOCK));
session.insert(new Item("C", 23, 80, ItemCode.BARREL));
session.insert(new Item("D", 85, 9, ItemCode.LOCK));
session.insert(new Item("E", 146, 189, ItemCode.STOCK));
session.insert(new Item("F", 16, 90, ItemCode.STOCK));
session.insert(new Item("G", 44, 140, ItemCode.BARREL));
session.fireAllRules();
}
}
得出如下测试结果:
Item G price in range: 44 itemCode: BARREL
Item F weight in range: 90 itemCode: STOCK
Item C price in range: 23 itemCode: BARREL
Item A weight in range: 42 itemCode: LOCK
分享到:
相关推荐
SpringBoot和Drools的整合应用为业务规则的管理和执行提供了强大的灵活性。SpringBoot作为一个轻量级的Java开发框架,简化了Spring应用的初始化和配置,使得开发过程更加高效。而Drools则是一个强大的规则引擎,它...
5. **KieSession与规则执行**:KieSession是Drools的执行上下文,用于管理规则的运行。它提供了fireAllRules()方法来执行所有匹配的规则。文档会介绍如何创建和管理KieSession。 6. **决策表(Decision Table)**:...
通过《Drools开发最全中文版技术指南》,你可以学习到如何创建和管理Drools项目,包括规则的编写、导入导出、测试以及如何在Java应用中集成Drools。此外,你还能了解到如何使用Drools工作台(Drools Guvnor)进行...
Drools5.x 是一款基于 Java 的开源规则引擎,它允许开发者在业务逻辑层中使用基于规则的编程方法来构建灵活、可管理的业务规则。规则引擎作为一种软件组件,专门用于根据一组定义好的规则来处理业务逻辑。Drools5.x ...
drools 提供了一个高效的决策自动化框架,使得非技术人员也能通过规则语言进行业务规则的维护。 在描述中,虽然没有具体信息,但可以推测drools可能被用于处理一系列的业务流程或决策,可能涉及到数据验证、业务...
《Drools中文技术指南》全面解析 Drools,原名为JBoss Rules,是一款强大的开源业务规则引擎,旨在让企业策略的访问、调整和管理变得更加简单高效。它基于Charles Forgy的Rete算法,提供了面向对象(OO)的接口,使...
最后,本书可能还会探讨Drools5与其他技术的结合,如机器学习、复杂事件处理等,以展示其在智能决策系统中的应用潜力。 通过《Drools5规则引擎开发教程》,开发者不仅可以掌握Drools5的基本使用,还能深入理解规则...
Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java
《Drools5规则引擎开发教程》是一份深入解析Drools5的资源包,它旨在帮助开发者理解和应用这个强大的业务规则管理系统。Drools5是JBOSS公司的开源项目,是一个基于Java的规则引擎,它允许开发人员将业务逻辑以规则的...
Drools5常应用于金融风控、保险核保、供应链管理等领域,通过规则引擎动态调整业务策略,提升决策效率。 ### 7. 开发与部署 本教程将详细介绍如何在Java项目中集成Drools5,包括依赖配置、规则加载、会话创建与...
这个“Drools5规则引擎开发教程”将带你深入理解Drools5的核心概念和功能,帮助你有效地在业务应用中实施规则引擎。 一、Drools5简介 Drools5是JBOSS公司推出的开源规则引擎,其核心是基于Rete算法的推理引擎。Rete...
drools决策表模版
5. **Drools高级特性** - **global全局变量**:跨规则共享数据。 - **query查询**:创建可重用的规则查询。 - **function函数**:自定义函数以增强规则表达能力。 - **其他属性**:如`in`, `not`, `exists`等,...
通过这种方式,Drools可以轻松地集成到Spring应用中,实现动态的规则模板引擎。它可以极大地提高业务逻辑的灵活性,使得规则的调整和维护变得简单易行。同时,由于Drools的强大功能,它还支持更复杂的逻辑,如决策表...