首页 > 其他分享 >drools_08_event_listener

drools_08_event_listener

时间:2022-10-23 13:56:16浏览次数:42  
标签:drools kSession 08 order listener api org import event

KieSession 除了提供丰富的API外, 还提供三个event listener, 方便对于规则执行状况的监控.

AgendaEventListener

该接口可以监控 rule 被fire, 所以这个listener最常用, 对于规则的计算, 我们很可能需要做logging, 常见的做法是在drl的RHS主动做logging, 但这并不是很好的方式, 一来RHS代码会变得冗长, 二来也可能会漏写logging.
使用方法:
Drools 提供了一个缺省的 DefaultAgendaEventListener 类, 我们可以实例化一个这个类, 并重载beforeMatchFired() 和 afterMatchFired() 方法.

RuleRuntimeEventListener

可以监听哪些fact是在rule 通过 insert()/update()/delete() 宏函数重触发了规则计算.
关于 update() 宏函数的重新触发, 如果一个规则的LHS部分用到的对象属性, 在规则的RHS做了修改, 那么执行update()宏函数会重复触发该规则, 如果修改的属性不涉及LHS部分, 本规则将不会被重新触发.
使用方法:
Drools 提供了一个缺省的 DefaultRuleRuntimeEventListener 类, 我们可以实例化一个这个类.

ProcessEventListener

这个监听的事件仅和jBPM相关, 所以不需要关心.

示例代码

  • drl 规则文件:
package com.sample.rules
 
import com.sample.Order;

 
rule "not_worry_loop"
   when
       $order:Order(originalPrice>0)
   then
      $order.setAmount(100);
      update($order) ; //trigger DefaultRuleRuntimeEventListener  
end   
  • java 测试文件:
package com.sample;

import java.util.List;

import org.drools.core.event.DefaultAgendaEventListener;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.DefaultRuleRuntimeEventListener;
import org.kie.api.event.rule.ObjectDeletedEvent;
import org.kie.api.event.rule.ObjectUpdatedEvent;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class UnitTest {

	@Test
	public void test() {

		// load up the knowledge base
		KieServices ks = KieServices.Factory.get();
		KieContainer kContainer = ks.getKieClasspathContainer();
		KieSession kSession = kContainer.newKieSession("ksession-rules");

		kSession.addEventListener(new DefaultAgendaEventListener() {
			@Override
			public void afterMatchFired(AfterMatchFiredEvent event) {
				// TODO Auto-generated method stub
				super.afterMatchFired(event);
				System.out.println("=============");
				List<Object> orders = event.getMatch().getObjects();
				for (Object order : orders) {
					System.out.println(order);
				}
			}
		});

		kSession.addEventListener(new DefaultRuleRuntimeEventListener() {
			@Override
			public void objectDeleted(ObjectDeletedEvent event) {
				// TODO Auto-generated method stub
				super.objectDeleted(event);
				System.out.println("deleted:" + event.getOldObject());
			}

			@Override
			public void objectUpdated(ObjectUpdatedEvent event) {
				// TODO Auto-generated method stub
				super.objectUpdated(event);
				System.out.println("update:" + event.getObject());
			}
		});

		Order order = null;
		order = new Order();
		order.setAmount(2);
		order.setOriginalPrice(0.2D);
		kSession.insert(order);

		order = new Order();
		order.setAmount(20);
		order.setOriginalPrice(2.0D);
		kSession.insert(order);
		kSession.fireAllRules();

		kSession.dispose();

	}
}

标签:drools,kSession,08,order,listener,api,org,import,event
From: https://www.cnblogs.com/harrychinese/p/drools_08_event_listener.html

相关文章

  • [ARC081F] Flip and Rectangles
    考虑转换题目给出的条件。可以观察到一些性质若某个矩形能被操作为全\(1\),那么其任意子矩形也一定可以。任意行列交换不影响矩阵是否能变为全\(1\)然后重要的来了......
  • drools_07_macro_functions
    delete()和retract()宏函数delete()用于在ruleRHS中将对象从工作内存中删除,retract()函数有同样的作用,不过已经被标记为废弃状态.insert()宏函数insert()用于......
  • 洛谷 P8089
    考虑对于满二叉树,显然只与\(dep\)有关,设\(f_{i}\)表示深度为\(i\)的答案(确切的说应该是到最深深度的距离),则有\(f_1=1,f_i=(f_{i-1}+1)^2(i\ge2)\)。则对于完全二叉......
  • Python教程Day08-元组
    元组一、应用场景思考:如果想要存储多个数据,但是这些数据是不能修改的数据,怎么做?答:列表?列表可以一次性存储多个数据,但是列表中的数据允许更改。num_list=[10,20,30]num_......
  • P2607 [ZJOI2008] 骑士
    #include<bits/stdc++.h>//#include<windows.h>usingnamespacestd;#definelllonglongconstintN=1e6+1;intn;inth[N],nt[N*2],to[N*2];intcnt;voidadd(i......
  • LY3207/LY3208可定时18秒36秒集成充电马达
    概述LY3208 是一款可充电的带使能控制的马达驱动芯片,集成了锂电池充电管理模块、马达驱动控制模块和保护模块,关机待机电流仅 5uA。LY3208 充电电流为 0.3A-1A 可调,最大......
  • 苹果iPhone 14系列拆解:APL109A/338S00942和338S00839-B0 电源管理芯片
    日前,iFixit对苹果iPhone14ProMax进行了拆解。先看主控SoC所在的主板的一面:红色:苹果A16处理器,型号为APL1W10/339S01104,64位六核CPU+五核GPU,由台积电6nm工艺代工。实际......
  • 2022-2023-1 20221408《计算机基础与程序设计》第八周学习总结
    第八周学习总结作业信息这个作业属于哪个课程:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业的要求在哪里:https://www.cnblogs.com/rocedu/p/9577842......
  • robotframework自动化测试框架实战教程:创建及使用监听器(listener)接口
    RobotFramework提供了一个监听器(listener)接口可以用来接收测试执行过程中的通知. 监听器通过在命令行中设置选项 --listener 来启用,和导入测试库类似,你也可以指定......
  • VS 2008 附加到进程测试 WIndow Service
    前提条件:首先安装windowservice 接受项目的时候,已经装好了不过还是贴一下安装步骤:https://www.jb51.net/article/238742.htm准备测试1.把项目编译一下,在项目所......