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对象使用的是KnowledgeBuilderFactorynewKnowledgeBuilder方法。

2)      KnowledgeBase

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

3)      StatefulKnowledgeSession

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

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

扫描二维码关注公众号,回复: 735088 查看本文章

4)      StatelessKnowledgeSession

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

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

猜你喜欢

转载自allenson933.iteye.com/blog/1426449