正能量网站ip,广州信息流推广公司,优化系统软件,南京小视科技是干什么的文章目录 Drools开源业务规则引擎#xff08;三#xff09;- 事件模型#xff08;Event Model#xff09;1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类My… 文章目录 Drools开源业务规则引擎三- 事件模型Event Model1.org.kie.api.event2.RuleRuntimeEventManager3.RuleRuntimeEventListener接口说明示例规则文件规则执行日志输出 4.AgentaEventListener接口说明示例监听器实现类MyAgendaEventListener规则文件规则执行日志输出 Drools开源业务规则引擎三- 事件模型Event Model
1.org.kie.api.event
在org.kie.api.event 中提供了规则引擎相关的事件监听和处理机制允许开发者在规则引擎执行过程中监听和处理事件包括规则触发、断言对象等并且还有利于将日志记录和应用程序的核心功能以及规则分离。
接口摘要
InterfaceDescriptionKieRuntimeEventKIE运行时生成的事件。KieRuntimeEventManagerKIE运行事件的管理器
KieRuntimeEventManager接口由KieRuntime实现它提供两个接口RuleRuntimeEventManager和ProcessEventManagerKieRuntimeEventManager类图如下。本章仅介绍RuleRuntimeEventManager。 2.RuleRuntimeEventManager
RuleRuntimeEventManager允许添加和删除侦听器以便可以侦听工作内存和agenda的事件。 Drools 还提供DebugRuleRuntimeEventListener和DebugAgentaEventListener通过调试打印语句实现每个方法。
示例
//添加 DebugRuleRuntimeEventListener
ksession.addEventListener( new DebugRuleRuntimeEventListener());
//添加 DebugAgentaEventListener
ksession.addEventListener( new DebugAgentaEventListener());3.RuleRuntimeEventListener
接口说明
public interface RuleRuntimeEventListener extends EventListener {void objectInserted(ObjectInsertedEvent event);void objectUpdated(ObjectUpdatedEvent event);void objectDeleted(ObjectDeletedEvent event);
}objectInserted表示发生了插入事实的事件objectUpdated表示发生了更新事实的事件objectDeleted表示发生了删除事实的事件
示例
规则文件
rule age
enabled true
when$in:UserIn(age 10)
then$in.setAge(1);update($in);
endrule in_rule
enabled true
when$in:UserIn(name in (jack,mary))
thenoutput.setAgeStages(命中了in条件);delete($in);
end规则执行
KieBase kieBase kieHelper.build(kieBaseConfiguration);
// 创建会话
KieSession kieSession kieBase.newKieSession();
// 创建规则输出对象
UserOut output new UserOut();
kieSession.setGlobal(output, output);
// 创建规则输入对象
UserIn input new UserIn();
input.setAge(19);
input.setName(jack);
// 添加事件监听
kieSession.addEventListener(new DebugRuleRuntimeEventListener());
// 执行规则
kieSession.insert(input);
kieSession.fireAllRules();日志输出 4.AgentaEventListener
接口说明
public interface AgendaEventListenerextendsEventListener {void matchCreated(MatchCreatedEvent event);void matchCancelled(MatchCancelledEvent event);void beforeMatchFired(BeforeMatchFiredEvent event);void afterMatchFired(AfterMatchFiredEvent event);void agendaGroupPopped(AgendaGroupPoppedEvent event);void agendaGroupPushed(AgendaGroupPushedEvent event);void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event);void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event);
}matchCreated在规则匹配创建时触发当规则条件满足时创建一个匹配项。matchCancelled在规则匹配取消时触发当规则条件不再满足时取消一个匹配项。beforeMatchFired在规则执行前触发可以用于在规则执行前进行一些前置处理。afterMatchFired在规则执行后触发可以用于在规则执行后进行一些后置处理。agendaGroupPopped当一个AgendaGroup被弹出Popped时将触发此方法。AgendaGroup是drl中的一个逻辑分组它可以包含多个规则Rule。当某个AgendaGroup不再是活动状态时即规则引擎不再对其进行处理时该AgendaGroup将被弹出。agendaGroupPushed当一个AgendaGroup被推入Pushed规则引擎时将触发此方法。。当某个AgendaGroup变为活动状态时即规则引擎开始对其进行处理时该AgendaGroup将被推入。beforeRuleFlowGroupActivated当一个规则流组RuleFlowGroup被激活之前将触发此方法。afterRuleFlowGroupActivated当一个规则流组RuleFlowGroup被激活之后将触发此方法。beforeRuleFlowGroupDeactivated当一个规则流组RuleFlowGroup被停用之前将触发此方法afterRuleFlowGroupDeactivated当一个规则流组RuleFlowGroup被停用之后将触发此方法
示例
监听器实现类MyAgendaEventListener
创建一个监听器实现类MyAgendaEventListener继承AgentaEventListener监听器接口默认的实现类DefaultAgendaEventListener。
Slf4j
public class MyAgendaEventListener extends DefaultAgendaEventListener {Overridepublic void matchCreated(MatchCreatedEvent event) {log.info(规则匹配创建{},event.getMatch().getRule().getName());}Overridepublic void matchCancelled(MatchCancelledEvent event) {log.info(规则匹配取消{},event.getMatch().getRule().getName());}Overridepublic void beforeMatchFired(BeforeMatchFiredEvent event) {log.info(规则执行前{},event.getMatch().getRule().getName());}Overridepublic void afterMatchFired(AfterMatchFiredEvent event) {log.info(规则执行后{},event.getMatch().getRule().getName());}Overridepublic void agendaGroupPopped(AgendaGroupPoppedEvent event) {log.info(AgendaGroup弹出{},event.getAgendaGroup().getName());}Overridepublic void agendaGroupPushed(AgendaGroupPushedEvent event) {log.info(AgendaGroup推入{},event.getAgendaGroup().getName());}Overridepublic void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {log.info(RuleFlowGroup激活前{},event.getRuleFlowGroup().getName());}Overridepublic void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {log.info(RuleFlowGroup激活后{},event.getRuleFlowGroup().getName());}Overridepublic void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {log.info(RuleFlowGroup停用前{},event.getRuleFlowGroup().getName());}Overridepublic void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) {log.info(RuleFlowGroup停用后{},event.getRuleFlowGroup().getName());}
}规则文件
rule age
enabled true
// 自版本6.x起agenda-group和ruleflow-group两个概念已经合并
// ruleflow-group flow 相当于 agenda-group flow
ruleflow-group flow
when$in:UserIn(age 10)
thenoutput.setAgeStages(大于10);
endrule in_rule
enabled true
ruleflow-group flow
when$in:UserIn(age 10)
thenoutput.setAgeStages(小于等于10);
end规则执行
KieBase kieBase kieHelper.build(kieBaseConfiguration);
// 创建会话
KieSession kieSession kieBase.newKieSession();
// 创建规则输出对象
UserOut output new UserOut();
kieSession.setGlobal(output, output);
// 创建规则输入对象
UserIn input new UserIn();
input.setAge(19);
input.setName(jack);
// 设置焦点
kieSession.getAgenda().getAgendaGroup(flow).setFocus();
// 添加事件监听
kieSession.addEventListener(new MyAgendaEventListener());
// 执行规则
kieSession.insert(input);
kieSession.fireAllRules();日志输出