`
duyangsss
  • 浏览: 127403 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Drools 5 模板技术应用(drools template)

 
阅读更多
引用自[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
分享到:
评论
1 楼 ZhaojieSmall 2015-11-18  

相关推荐

    springboot+drools动态模板引擎

    SpringBoot和Drools的整合应用为业务规则的管理和执行提供了强大的灵活性。SpringBoot作为一个轻量级的Java开发框架,简化了Spring应用的初始化和配置,使得开发过程更加高效。而Drools则是一个强大的规则引擎,它...

    drools7.25中文文档+drools技术指南.zip

    5. **KieSession与规则执行**:KieSession是Drools的执行上下文,用于管理规则的运行。它提供了fireAllRules()方法来执行所有匹配的规则。文档会介绍如何创建和管理KieSession。 6. **决策表(Decision Table)**:...

    Drools开发最全中文版技术指南

    通过《Drools开发最全中文版技术指南》,你可以学习到如何创建和管理Drools项目,包括规则的编写、导入导出、测试以及如何在Java应用中集成Drools。此外,你还能了解到如何使用Drools工作台(Drools Guvnor)进行...

    Drools5.x 规则引擎开发教程

    Drools5.x 是一款基于 Java 的开源规则引擎,它允许开发者在业务逻辑层中使用基于规则的编程方法来构建灵活、可管理的业务规则。规则引擎作为一种软件组件,专门用于根据一组定义好的规则来处理业务逻辑。Drools5.x ...

    drools drools drools drools drools

    drools 提供了一个高效的决策自动化框架,使得非技术人员也能通过规则语言进行业务规则的维护。 在描述中,虽然没有具体信息,但可以推测drools可能被用于处理一系列的业务流程或决策,可能涉及到数据验证、业务...

    Drools-中文技术指南.pdf

    《Drools中文技术指南》全面解析 Drools,原名为JBoss Rules,是一款强大的开源业务规则引擎,旨在让企业策略的访问、调整和管理变得更加简单高效。它基于Charles Forgy的Rete算法,提供了面向对象(OO)的接口,使...

    Drools5规则引擎开发教程.pdf

    最后,本书可能还会探讨Drools5与其他技术的结合,如机器学习、复杂事件处理等,以展示其在智能决策系统中的应用潜力。 通过《Drools5规则引擎开发教程》,开发者不仅可以掌握Drools5的基本使用,还能深入理解规则...

    Drools6 和 Drools7技术指南-中文文档.zip

    Drools开发最全中文版技术指南。 Drools开发最全中文版技术指南,介绍了常见的drools如何进行开发,注意是:中文版中文版中文版! drools 中文文档 规则引擎 drools6 drools7 Java

    Drools5规则引擎开发教程.zip

    《Drools5规则引擎开发教程》是一份深入解析Drools5的资源包,它旨在帮助开发者理解和应用这个强大的业务规则管理系统。Drools5是JBOSS公司的开源项目,是一个基于Java的规则引擎,它允许开发人员将业务逻辑以规则的...

    Drools5规则引擎开发教程.pdf.zip-最新-目录-完整

    Drools5常应用于金融风控、保险核保、供应链管理等领域,通过规则引擎动态调整业务策略,提升决策效率。 ### 7. 开发与部署 本教程将详细介绍如何在Java项目中集成Drools5,包括依赖配置、规则加载、会话创建与...

    Drools5规则引擎开发教程.rar

    这个“Drools5规则引擎开发教程”将带你深入理解Drools5的核心概念和功能,帮助你有效地在业务应用中实施规则引擎。 一、Drools5简介 Drools5是JBOSS公司推出的开源规则引擎,其核心是基于Rete算法的推理引擎。Rete...

    drools决策表模版.xls

    drools决策表模版

    Drools规则引擎从入门到精通

    5. **Drools高级特性** - **global全局变量**:跨规则共享数据。 - **query查询**:创建可重用的规则查询。 - **function函数**:自定义函数以增强规则表达能力。 - **其他属性**:如`in`, `not`, `exists`等,...

    流口水:使用drools实现规则模板引擎

    通过这种方式,Drools可以轻松地集成到Spring应用中,实现动态的规则模板引擎。它可以极大地提高业务逻辑的灵活性,使得规则的调整和维护变得简单易行。同时,由于Drools的强大功能,它还支持更复杂的逻辑,如决策表...

Global site tag (gtag.js) - Google Analytics