首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Drools学习札记2

2012-07-05 
Drools学习笔记2接上面的代码:?public class DroolsTest {public static final void main(String[] args)

Drools学习笔记2

接上面的代码:

?

public class DroolsTest {    public static final void main(String[] args) {        try {            // load up the knowledge base            KnowledgeBase kbase = readKnowledgeBase();            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");            // go !            PeopleEvent pe = new PeopleEvent();            pe.setComming(true);            pe.setRoomId(1);            TemperatureEvent te =  new TemperatureEvent();            te.setTemperature(19.5f);            te.setRoomId(1);            ksession.insert(pe);            ksession.insert(te);            ksession.fireAllRules();            logger.close();        } catch (Throwable t) {            t.printStackTrace();        }    }    private static KnowledgeBase readKnowledgeBase() throws Exception {        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();        kbuilder.add(ResourceFactory.newClassPathResource("FirstRule.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.");        }        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());        return kbase;    }    public static class PeopleEvent {    private boolean isComming;    private int roomId;    public boolean getIsComing() {return isComming;}public void setComming(boolean isComming) {this.isComming = isComming;}public int getRoomId() {return roomId;}public void setRoomId(int roomId) {this.roomId = roomId;}    }    public static class TemperatureEvent{    private float temperature;    private int roomId;public float getTemperature() {return temperature;}public void setTemperature(float temperature) {this.temperature = temperature;}public int getRoomId() {return roomId;}public void setRoomId(int roomId) {this.roomId = roomId;}    }}

?

?好了,接下来介绍一下如何来执行Drools是如何来执行规则的,要理解上面的代码首先要清楚Drools API中关于一下几个类的描述:

1)????? KnowledgeBuilder ?

??? ??? KnowledgeBuilder就是用来在业务代码中收集已经编好的规则,找到这些规则并把这些规则文件进行编译,最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。而创建KnowledgeBuilder对象使用的是KnowledgeBuilderFactory的newKnowledgeBuilder方法。

2)????? KnowledgeBase

?????? KnowledgeBase 是Drools提供的用来收集应用当中知识(Knowledge)定义的知识库对象,在一个KnowledgeBase 当中可以包含普通的规则、规则流、函数定义、用户自定义对象等。KnowledgeBase本身不包含任何业务数据对象(fact 对象),业务对象都是插入到由KnowledgeBase产生的两种类型的session对象(StatefulKnowledgeSession和StatelessKnowledgeSession在后面进行介绍)中,而这两种session对象可以用来触发规则。

3)????? StatefulKnowledgeSession

???? StatefulKnowledgeSession对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道。StatefulKnowledgeSession执行完之后一定要调用dispose()方法释放资源。

???? StatefulKnowledgeSession可以接受外部插入(insert方法)的业务数据——也叫fact,一个对象通常可以对应一个普通的POJO, 而一个POJO有若干个属性来描述这个业务对象,比如一个PeopleEvent中包含了isComing(人是否进来属性), roomed(房间号),每一个属性对应getter和setter方法,供规则定义来使用(注意:在规则定义中isComing默认的getter方法是getIsComing())。如果规则当中需要有数据传出,那么可以通过在StatefulKnowledgeSession当中设置global对象来实现,一个global对象也是一个普通的Java对象,在向StatefulKnowledgeSession当中设置global对象时不用insert方法而用setGlobal方法实现。

4)????? StatelessKnowledgeSession

??????? StatelessKnowledgeSession是在StatefulKnowledgeSession基础上进行进一步的封装,它跟StatefulKnowledgeSession的区别就是它不在需要调用dispose()方法释放内存资源了,但它不能重复的插入fact的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,因为它不能保存状态,对应的这些要完成的工作在StatelessKnowledgeSession当中只有execute()方法,通过这个方法可以实现插入所有的fact并且可以同时执行所有的规则或规则流。

???????? 结合上面的代码应该可以更好的了解这四个概念。下面介绍如何更好的使用Drools。

热点排行