引用自[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作为框架集成drools。
drools drools drools drools drools
Drools是一款基于java的开源规则引擎 ,要求JDK1.5或以上版本。正所谓学习一门语言都是从环境开始。搭建环境,测试第一个HELLOWORD
drools最新版本学习资料,里面系统的介绍了drools规则引擎的简介以及集成到项目的教程内容。欢迎下载,收集不易,欢迎点赞。
从基础讲起,结合应用场景,由浅到深细化讲解drools规则引擎的的相关知识,并结合具体实例,演示功能的使用和注意事项。后面通过搭建具体的项目并结合springboot框架联合使用Drools的相关知识包括决策表的使用,囊括...
Drools JBoss Rules 5.0 Developer's GuideDevelop rules-based business logic using the Drools platform
Drools5 规则引擎开发教程 图文教程 介绍drools 入门
drools的开发教程,针对版本5的,介绍比较详细
Drools应用手册.doc,实用JBPM开发参考
drools决策表模版
Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java
drools 规则引擎中文文档,含 规则可视化操作说明,规则配置说明等; Drools 实现和提供了 Rete 算法;也曾提供 Leaps,但因为它无人维护而撒销了。Drools Rete 实现也被称为 ReteOO
Java规则引擎---Drools的介绍及应用
Drools5.x 规则引擎开发教程 比较详细的介绍了规则引擎的作用 以及基础知识 规则编写案例 开发案例
drools5 eclipsejar
Drools5规则引擎开发教程.zip
Drools5规则引擎开发教程.pdf.zip-最新-目录-完整Drools5规则引擎开发教程.pdf.zip-最新-目录-完整
Drools5规则引擎开发教程
该技术指南为开源的,内容少一些, 但做入门是没有什么问题的,如果有需要可以联系我 特此声明: 小编出新版本的Drools技术指南的文档啦,相比之前的免费版添加了如下特点: 1. 内容更加全面,更多细节,更多知识点...
Drools5规则引擎开发教程,文字版PDF,清晰。