Drools5 KnowledgeSession 的两种对象

Drools5当中提供了两个对象与规则引擎进行交互: StatefulKnowledgeSession 
和 StatelessKnowledgeSession。 
StatefulKnowledgeSession 
顾名思义,就是有状态的会话,在推理过程中可以记录对象推理的中间状态。StatefulKnowledgeSession对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用户的代码当中,最后使用完 StatefulKnowledgeSession 对象之后,一定要调用其 dispose()方法以释放相关内存资源。 
规则引擎可以接受外部插入(insert)的业务数据——也叫 fact,一个fact对象通常是一个普通的Java的POJO,一般它们会有若干个属性,每一个属性都会对应 
getter和 setter方法,用来对外提供数据的设置与访问。一般来说,在Drools规则引擎当中,fact所承担的作用就是将规则当中要用到的业务数据从应用当中传入进来,对于规则当中产 
生的数据及状态的变化通常不用 fact传出。如果在规则当中需要有数据传出,那么可以通过 
在 StatefulKnowledgeSession 当中设置 global 对象来实现,一个 global 对象也是一个普通的Java 对象,在向 StatefulKnowledgeSession 当中设置 global 对象时不用 insert 方法而用setGlobal方法实现。 
在将FACT插入规则引擎后,StatefulKnowledgeSession 需调用 fireAllRules()方法触发所有的规则执行,最后调用 dispose()方法将内存资源释放。 

StatelessKnowledgeSession 
StatelessKnowledgeSession的作用与 StatefulKnowledgeSession 相仿,它们都是用来接收业务数据、执行规则的。事实上,StatelessKnowledgeSession 对StatefulKnowledgeSession做了包装,使得在使用 StatelessKnowledgeSession 对象时不需要再调用 dispose()方法释放内存资源了。 
因为 StatelessKnowledgeSession 本身所具有的一些特性,决定了它的使用有一定的局限 
性。在使用 StatelessKnowledgeSession 时不能进行重复插入 fact的操作、也不能重复的调用fireAllRules()方法来执行所有的规则,对应这些要完成的工作在 StatelessKnowledgeSession当中只有 execute(…)方法,通过这个方法可以实现插入所有的 fact并且可以同时执行所有的规则或规则流,事实上也就是在执行 execute(…)方法的时候就在 StatelessKnowledgeSession内部执行了 insert()方法、fireAllRules()方法和 dispose()方法。 

你可能感兴趣的:(drools)