转载自 http://thinkinside.tk/2013/12/20/drools_API.html
规则引擎中,将知识表达为规则(rules),要分析的情况定义为事实(facts)。二者在内存中的存储分别称为Production Memory和Working Memory。在外围,还会有一个执行引擎(Execution Engine)。
与此对应,规则引擎API也分成三个部分。在Drools中,分别叫做:
Knowledge API: 相关API一般都在org.drools.builder下
Fact API:相关的API一般都在org.drools.command下
Execution API:相关的API都在org.drools.runtime下
Knowledge API
Drools将知识库(KnowledgeBase)作为JSR94中的规则执行集(RuleExecutionSet)。知识库中的知识以包(KnowledgePackage)为单位组合而成。每个包中聚合多个规则(Rule)。
通常,一个包中的内容会在一个或多个资源(Resource)中保存。资源的类型可以有很多种,如.drl 文件、.dslr 文件或 xls 文件等。
规则包还可以从规则流(rule flow) 文件中获取。
与此对应,Drools定义了一组Knowledge API来操作知识库。
构建知识库的一般过程为:
- 通过ResourceFactory获取资源。可以从Classpath、URL、File、ByteArray、Reader等输入源中获取
- 构建KnowledgeBuilder,将资源添加到KnowledgeBuilder中。KnowledgeBuilder通常由KnowledgeBuilderFactory创建
- 从KnowledgeBuilder中获取规则包
- 创建KnowledgeBase,可以通过KnowledgeBaseConfiguration定义KnowledgeBase的一些属性,默认的配置位于drools-core-VERSION.jar 包下 META-INF/drools.default.rulebase.conf 文件中
- 将规则包添加到KnowledgeBase
- 为KnowledgeBase添加KnowledgeBaseEventListener,可以监控KnowledgeBase中的事件
代码示例:
KnowledgeBase buildKBase(){
Resource res = ResourceFactory.newClassPathResource("hello.drl", Demo.class);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
kbuilder.add(res,ResourceType.DRL);
//validate
if (kbuilder.hasErrors()) {
System.out.println("规则中存在错误,错误消息如下:");
KnowledgeBuilderErrors kbuidlerErrors = kbuilder.getErrors();
for (Iterator iter = kbuidlerErrors.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
}
Collection<KnowledgePackage> kpackages = kbuilder.getKnowledgePackages();
KnowledgeBaseConfiguration kbConf =
KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
kbConf.setProperty( "org.drools.sequential", "true");
//KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeBase kbase =
KnowledgeBaseFactory.newKnowledgeBase(kbConf);
kbase.addKnowledgePackages(kpackages);
return kbase;
}
Fact API
要操作Working Memory,首先要建立规则引擎的一个会话。Drools中的有状态会话和无状态会话分别为StatefulKnowledgeSession和StatelessKnowledgeSession,都可以由KnowledgeBase建立。
通过会话可以进行操作Fact对象,执行规则等交互,例如:
KnowledgeBase kbase = buildKBase();
StatefulKnowledgeSession statefulKSession=kbase.newStatefulKnowledgeSession();
statefulKSession.setGlobal("globalTest", new Object());
statefulKSession.insert(new Object());
statefulKSession.fireAllRules();
statefulKSession.dispose();
StatefulKnowledgeSession中,insert()方法、fireAllRules()方法和 dispose()方法是分开执行的,这个过程中可以进行一定的控制, 而StatelessKnowledgeSession不同,在无状态会话中,上述三个方法被合并为execute()方法,不能分开调用。如果要插入多个Fact对象,只能使用集合,比如:
StatelessKnowledgeSession statelessKSession=kbase.newStatelessKnowledgeSession();
ArrayList list=new ArrayList();
list.add(new Object());
list.add(new Object());
statelessKSession.execute(list);
这样的特点决定了,无状态会话适合推演和分析,需要事先知道所有的事实(Fact);而有状态会话可以随时增加事实并进行批评,适合实际应用。
无状态会话中还可以使用execute(Command cmd)方法。比如,如果要在无状态会话中插入一个List,可以用CommandFactory生成一个关于List的Command:
statelessKSession.execute(CommandFactory.newInsert(list));
同样,无状态会话中如果要设置global,也需要使用Command:
ArrayList<Command> list=new ArrayList<Command>();
list.add(CommandFactory.newInsert(new Object()));
list.add(CommandFactory.newInsert(new Object()));
list.add(CommandFactory.newSetGlobal("key1", new Object()));
list.add(CommandFactory.newSetGlobal("key2", new Object()));
statelessKSession.execute(CommandFactory.newBatchExecution(list)) ;
Execution API
插入到WorkingMemory中的对象,并不是克隆,而是对原对象的引用。这就意味着引擎中可以改变外部的对象,这是引擎与外部数据交互的一个通道。
此外,insert()方法还会返回一个FactHandler,作为引擎中该Fact对象的一个句柄。
最后,session上可以注册AgendaEventListener、ProcessEventListener和WorkingMemoryEventListener,这也是常用的交互方式。 比如WorkingMemoryEventListener可以监听Fact对象变化的事件:
public interface WorkingMemoryEventListener
extends
EventListener {
void objectInserted(ObjectInsertedEvent event);
void objectUpdated(ObjectUpdatedEvent event);
void objectRetracted(ObjectRetractedEvent event);
}
相关推荐
1. **Drools概述**:了解Drools的基本概念,包括什么是规则引擎,Drools的核心组件(如知识库、工作内存、规则等)以及它如何处理和执行规则。 2. **Drools架构**:深入理解Drools的架构设计,包括Fact(事实)、...
**Drools规则引擎用户手册概述** Drools是一款强大的Java规则引擎,它允许开发者以声明式的方式编写业务规则,并在运行时执行这些规则。规则引擎的出现是为了解决传统编程方式中复杂的业务逻辑处理问题,使得业务...
**Drools5规则引擎开发教程** Drools5是一款强大的、开源的业务规则管理系统(BRMS),它基于Java平台,提供了高效的规则引擎,帮助企业快速实现业务规则的管理和执行。本教程将深入探讨Drools5的核心功能和开发...
1. **Drools概述**:这部分将介绍Drools的基本概念,包括什么是规则引擎,为什么需要规则引擎,以及Drools在业务流程中的作用。它会阐述Drools如何帮助开发者将业务逻辑从核心应用程序中分离出来,实现灵活的、可...
使用Drools API可以方便地操作规则引擎,如: - `KieServices`:提供创建和管理Kie对象的工厂方法。 - `KieContainer`:代表一个规则集,可以从DRL文件或JAR加载。 - `KieSession`:执行规则的上下文,可以插入...
### Drools规则引擎4.0中文使用手册知识点详解 #### 一、Drools 4.0概述 **Drools 4.0**作为从Drools 3.0.x系列以来的重大更新版本,引入了一系列重要的改进和新特性。这些更新不仅包括语言表达式的增强、核心引擎...
规则引擎概述 规则引擎是将业务逻辑从应用程序中分离出来的一种方式,使得业务规则可以独立于应用程序代码进行维护和更新。Drools 提供了一个高效的运行时环境,用于解析和执行这些规则,同时提供了丰富的API和工作...
### Drools5规则引擎开发教程知识点总结 #### 一、Drools5规则引擎简介 - **Drools5概述**:Drools是一个开源业务规则管理系统(BRM)和业务流程管理系统(BPM),广泛应用于Java应用程序中。Drools5是Drools系列中的...
【DROOLS规则引擎概述】 DROOLS是一个强大的业务规则管理系统,它允许开发者将复杂的业务逻辑从核心应用程序中分离出来,以规则的形式进行管理和维护。DROOLS是基于RETE算法的,这是一种高效的决策支持算法,能够...
规则引擎概述 规则引擎在业务流程中扮演着决策中心的角色,它可以接收输入数据,根据预定义的业务规则进行推理和决策,并产生相应的输出。Drools通过使用领域特定语言(DSL)来表达规则,使得非技术人员也能理解和...
Drools是一个开源规则引擎,支持业务流程管理和工作流管理等功能。本指南旨在详细介绍如何在Tomcat环境下部署Drools-Workbench及其相关组件,包括单机版和数据库版的安装步骤及常见问题解决方案。 #### 二、单机版...
在本文中,我们将深入探讨规则引擎的概念、使用场景以及如何利用Java中的Drools规则引擎实现业务逻辑。 首先,让我们了解规则引擎的核心概念。规则引擎基于一系列预定义的规则(通常是IF-THEN结构)来做出决策。...
《Drools4.0官方使用手册中文》与《Drools5规则引擎开发教程.pdf》是两个关于Drools规则引擎的重要参考资料。Drools是一个开源的业务规则管理系统(BRMS),它允许开发者通过规则语言来实现复杂的业务逻辑,以此提高...
#### 四、Drools规则引擎的应用 **1. Drools简介** Drools是一个开源的业务规则管理系统(BRMS),它提供了一套完整的工具链来创建、管理并部署业务规则。Drools支持多种规则语言,包括易于理解的自然语言风格的...
#### 一、规则引擎概述 规则引擎是一种软件系统,主要用于自动化决策过程,特别是那些复杂多变的业务规则。它允许非技术用户通过图形界面或其他工具定义业务规则,而无需修改源代码。规则引擎通常包含规则语言、...
Drools是一个基于Java语言开发的开源规则引擎,它遵循了业务规则引擎API(JSR 94)标准。Drools 7.1是该规则引擎的最新版本,提供了新的功能、技术细节改进以及API的更新。 在Drools 7.1中,包含了对旧版本的改进和...
### 规则引擎概述 规则引擎是软件系统的一个组件,用于实现业务规则的外部化管理。它提供了一种灵活的方式来定义、存储和执行业务逻辑规则,而无需更改应用程序代码。规则引擎允许业务分析师或非技术人员在不涉及...