通过debug跟踪Drools的执行源码,实现执行规则的记录(输出)功能。
在ksession.fireAllRules(); 进入类StatefulKnowledgeSessionImpl.fireAllRules()中
类StatefulKnowledgeSessionImpl主要涉及的成员变量及方法:
public ReteooWorkingMemory session;
public int fireAllRules() {
return this.session.fireAllRules();
}
其中ReteooWorkingMemory 继承自AbstractWorkingMemory
故上面return 调用的是AbstractWorkingMemory的fireAllRules()方法
类AbstractWorkingMemory主要涉及的成员变量及方法:
protected InternalAgenda agenda;
public synchronized int fireAllRules() throws FactException {
return fireAllRules( null, -1);
}
public synchronized int fireAllRules(final AgendaFilter agendaFilter,
int fireLimit) throws FactException {
if ( isSequential() ) {
for ( Iterator it = this.liaPropagations.iterator(); it.hasNext(); )
{
((LIANodePropagation) it.next()).doPropagation( this );
}
}
// do we need to call this in advance?
executeQueuedActions();
int fireCount = 0;
if ( this.firing.compareAndSet( false, true ) ) {
try {
fireCount = this.agenda.fireAllRules( agendaFilter,fireLimit);
} finally {
this.firing.set( false );
}
}
return fireCount;
}
调用了agenda.fireAllRules()方法,而DefaultAgenda实现了InternalAgenda接口
类DefaultAgenda所涉及的方法:
public int fireAllRules(AgendaFilter agendaFilter, int fireLimit) {
this.halt.set( false );
int fireCount = 0;
while ( continueFiring( fireLimit ) &&fireNextItem( agendaFilter )) {
fireCount++;
fireLimit = updateFireLimit( fireLimit );
this.workingMemory.executeQueuedActions();
}
if ( this.focusStack.size()==1 && getMainAgendaGroup().isEmpty() )
{
getMainAgendaGroup().setActive( false );
}
return fireCount;
}
其中fireNextItem方法如下:
public boolean fireNextItem(final AgendaFilter filter) throws ConsequenceException {
boolean tryagain, result;
do {
tryagain = result = false;
final InternalAgendaGroup group = (InternalAgendaGroup) getNextFocus();
// if there is a group with focus
if ( group != null ) {
final AgendaItem item = (AgendaItem) group.getNext();
// if there is an item to fire from that group
if ( item != null ) {
// if that item is allowed to fire
if ( filter == null || filter.accept( item ) ) {
// fire it
System.out.println(item.getRule().getName()); //输出执行的规则名
fireActivation( item );
result = true;
} else {
// otherwise cancel it and try the next
final EventSupport eventsupport = (EventSupport) this.workingMemory; eventsupport.getAgendaEventSupport().fireActivationCancelled( item, this.workingMemory, ActivationCancelledCause.FILTER );
tryagain = true;
}
}
}
} while ( tryagain );
return result;
}
使用ystem.out.println(item.getRule().getName())输出执行到的规则名
分享到:
相关推荐
4. **并行执行与约束**:Drools 还支持并行执行规则,这意味着多个规则可以同时触发并执行。然而,如果存在规则之间的约束(如互斥条件),Drools 会确保这些规则不会同时执行。 5. ** Agenda 组**:Agenda 是 ...
- **规则引擎**: 主要负责处理和执行规则,Drools 的核心就是规则引擎。 - **工作流引擎**: 处理业务流程控制,如任务分配、流程跳转等,Drools 5.5中结合了规则引擎,实现了规则与流程的集成。 3. **规则流创建*...
在信用卡申请实例中,可能还包含了错误处理和日志记录机制,确保在规则执行过程中出现问题时能够得到适当的反馈。此外,drools提供了丰富的API和工具,如Guvnor(现称为KieWorkbench),用于规则的管理、测试和版本...
- ** Agenda**:议程是Drools 决策过程的管理者,它负责根据规则的优先级和冲突解决策略来安排和执行规则。 - **KieSession**:KieSession 是与Drools 交互的主要接口,用于加载规则、插入事实、触发规则执行等...
3. 规则推理:Drools的推理引擎(Reasoner)会根据加载的规则和当前的事实进行匹配,找出符合条件的规则并执行其动作。 4. 结果反馈:执行结果会被返回给应用程序,以便进一步处理。 在实际应用中,Drools可以广泛...
6. **执行规则**: 调用KieSession的`fireAllRules()`方法,这会触发所有符合条件的规则。 7. **处理结果**: 规则执行后,可以监听到规则的触发情况,对结果进行处理。 在实际项目中,封装Drools可能还需要考虑以下...
2. **创建KieSession**:在Spring Boot的配置类或服务类中,初始化Drools的KieContainer,用于加载规则,并创建KieSession,这是执行规则的地方。 3. **定义规则**:编写DRL(Drools Rule Language)文件,这些文件...
开发者可以通过Drools的工作台(Drools Workbench)或直接在代码中加载规则文件,然后创建并实例化业务对象,调用Drools API来执行规则。通过日志和测试用例,可以观察和调试规则执行的过程。 7. **最佳实践** - ...
2. **规则引擎**:解析、编译并执行规则,它负责根据事实(应用程序中的数据)来触发规则的执行。 3. **工作内存**:工作内存是规则引擎运行时的数据结构,其中包含事实(输入数据)、规则和结果(输出数据)。 4. *...
接着,执行规则引擎的`fireAllRules()`方法来触发匹配的规则。 通过以上步骤,我们完成了Drools的简单入门示例。这不仅展示了如何定义规则和Fact对象,而且还演示了如何集成Drools到现有的Java项目中。 #### 三、...
规则引擎API还考虑了异常处理和日志记录,尽管它们本身并不直接提供这些功能,但可以与其他Java安全框架(如JAAS)集成以实现安全控制和日志记录。 在实际应用中,Drools可用于各种场景,如个人理财决策、风险评估...
开发者可以通过API接口加载规则文件(.drl),创建KieSession,然后执行规则。 ** 实现业务规则可配置化的关键步骤 ** 1. **规则定义**:使用DRL语言编写业务规则,这种语言类似于SQL,但用于表达条件和行动。规则...
Drools提供了用户指南,引导用户如何从基础开始使用该规则引擎,包括执行控制、推理、使用逻辑对象进行真相维护、电子表格中的决策表以及记录功能。其中,决策表是一种将复杂逻辑规则简化表示的方法,它允许用户以...
规则库存储所有定义好的规则,工作内存用于存放运行时的数据,议程则负责管理何时以及如何执行规则。在信用卡审批场景中,申请人信息会被加载到工作内存,Drools会根据这些信息触发相应的规则并执行,最后得出审批...
2. **kie-server**:这是实际执行规则的组件,它接收来自kie-drools-wb或其他客户端的请求,执行规则并返回结果。kie-server 可以作为一个独立的服务运行,也可以嵌入到其他应用中。 接下来,我们将讨论如何将...
4. **触发规则**:调用 KieSession 的 fireAllRules() 方法,让规则引擎开始匹配并执行规则。 5. **响应结果**:根据议程中的规则执行情况,系统会生成审批决策,并更新申请人对象的状态。 6. **日志记录**:为了...
Drools是一个开源的业务规则管理系统(BRMS),它支持业务逻辑的编写、执行和管理。该系统基于专家系统和产生式规则引擎原理,允许用户通过声明式的语言来定义业务规则。Drools提供了多种功能模块,包括规则引擎、...
- 创建KieServices:这是Drools的核心服务接口,用于创建和管理KieContainer,它是执行规则的容器。 - 加载KieModule:KieModule是Drools中的模块概念,包含了规则文件。可以通过KieServices读取规则资源并构建...
5. 规则执行监控:通过Audit Trail和Event Log,Drools可以记录规则执行的过程,便于后期分析和优化。 三、Drools 的应用场景 1. 金融风险评估:银行和金融机构可以使用Drools进行贷款审批、信用评分等风险控制。 ...
5. **用户指南**:这部分是Drools的实际使用手册,包括了如何使用Drools进行基础规则定义、执行控制、推理操作、维护逻辑对象的真相、决策表的电子表格处理、以及记录日志等。 6. **运行时和语言**:此章节涉及...