当前位置: 首页 > news >正文

赤峰微信网站建设典当行 网站

赤峰微信网站建设,典当行 网站,手机如何安装wordpress,设计公司网站设计方案🚀 Drools 议程组(AgendaGroup)执行顺序实验 📌 前言 在使用 Drools 规则引擎时,AgendaGroup(议程组)是一个重要的机制,它允许我们控制规则的执行顺序。默认的议程组 MAIN 包含所有…

🚀 Drools 议程组(AgendaGroup)执行顺序实验

📌 前言

在使用 Drools 规则引擎时,AgendaGroup(议程组)是一个重要的机制,它允许我们控制规则的执行顺序。默认的议程组 MAIN 包含所有没有指定议程组的规则,除非其他议程组有焦点,否则这个默认议程组会第一个执行。但当我们使用 setFocus() 方法来设置议程组的焦点时,会影响规则的执行顺序。每次setFocus方法被调用,drools会在堆栈头添加指定的议程组。ksession.getAgenda().getAgendaGroup( "Group A" ).clear(); 也可以通过clear()方法取消议程组的的执行。

本篇博客通过实验来验证 setFocus() 的执行逻辑,并探讨如何正确控制规则的执行顺序。


📝 实验目标

  1. 验证 setFocus() 采用后进先出(LIFO,Last In First Out)执行机制
  2. 测试多个 AgendaGroup 规则的执行顺序
  3. 探讨如何调整 AgendaGroup 的执行顺序

📌 1. 规则定义

我们定义两个规则,分别属于 report 议程组 和 calculation 议程组,每个规则触发时都会打印日志并记录执行顺序。

kmodule.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.drools.org/xsd/kmodule"><kbase name="test_focus_sessionKB" packages="rules"><ksession name="test_focus_session"/></kbase></kmodule>

Kmodule.xmlpackages包名和下面test_setFoucus.drl的相对应

test_setFoucus.drl 规则文件

package rulesglobal java.util.List logList;  // 用于记录规则执行顺序rule "Report Rule"agenda-group "report"  // 规则属于 report 组
when$msg : String(this == "trigger")
thenlogList.add("Report executed");System.out.println("【Report】Rule executed");
endrule "Calculation Rule"agenda-group "calculation"  // 规则属于 calculation 组
when$msg : String(this == "trigger")
thenlogList.add("Calculation executed");System.out.println("【Calculation】Rule executed");
endrule "ttest"agenda-group "ttest"  // 规则属于 ttest 组
when$msg : String(this == "trigger")
thenlogList.add("ttest");System.out.println("ttest");
end

📌 2. Java 代码

在 Java 代码中,我们:

  • 创建 KieSession 并设置全局变量 logList,用于记录执行顺序。
  • 使用 setFocus() 设定议程组的执行顺序。
  • 执行 fireAllRules(),触发规则执行。

TestSetFocus.java 规则文件

package com.neo.drools;import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.Agenda;
import java.util.ArrayList;
import java.util.List;public class TestSetFocus {public static void main(String[] args) {// 获取 KieServices 工厂实例KieServices ks = KieServices.Factory.get();// 获取 KieContainer(Drools 规则引擎容器),用于管理 KieSessionKieContainer kc = ks.getKieClasspathContainer();// 执行 Drools 规则execute(kc);}public static void execute(KieContainer kc) {// 创建 KieSession(Drools 规则引擎的会话),用于执行规则KieSession ksession = kc.newKieSession("test_focus_session");// 防止 KieSession 为空,避免 NullPointerExceptionif (ksession == null) {throw new RuntimeException("KieSession 创建失败,请检查 kmodule.xml 和 rules.drl 规则文件!");}// 创建 List 作为全局变量,用于记录规则执行顺序List<String> logList = new ArrayList<>();ksession.setGlobal("logList", logList); // 将 logList 设置为 Drools 规则中的全局变量// 插入触发事实(用于匹配规则)ksession.insert("trigger");// 获取 Agenda(议程)对象,用于管理规则执行顺序Agenda agenda = ksession.getAgenda();// 设置 report 组的规则执行(先压入 report 组,但后执行)System.out.println("\n===== Setting Focus: report =====");agenda.getAgendaGroup("report").setFocus();// 设置 calculation 组的规则执行(再压入 calculation 组,但先执行)System.out.println("\n===== Setting Focus: calculation =====");agenda.getAgendaGroup("calculation").setFocus();// 触发规则执行System.out.println("\n===== Firing All Rules =====");ksession.fireAllRules();// 打印规则执行顺序System.out.println("\n===== Execution Order =====");System.out.println(logList);// 释放 KieSession 资源ksession.dispose();}
}

📌 3. 实验结果

执行 Java 代码,得到如下输出:

===== Setting Focus: report ========== Setting Focus: calculation ========== Firing All Rules =====CalculationRule executed
【ReportRule executed===== Execution Order =====
[Calculation executed, Report executed]进程已结束,退出代码为 0

🔹 结果分析

  • setFocus("report") 先调用,setFocus("calculation") 后调用。
  • Drools 采用 LIFO(后进先出),所以 calculation 先执行,然后 report 后执行。
  • 可以看到rule "ttest"压根就不会被加入判断,因为没给它用setFocus,它并不是焦点规则组。

默认的议程组 MAIN 包含所有没有指定议程组的规则,除非其他议程组有焦点,否则这个默认议程组会第一个执行。但当我们使用 setFocus() 方法来设置议程组的焦点时,会影响规则的执行顺序。每次setFocus方法被调用,drools会在堆栈头添加指定的议程组。ksession.getAgenda().getAgendaGroup( "Group A" ).clear(); 也可以通过clear()方法取消议程组的的执行。

http://www.dtcms.com/a/468316.html

相关文章:

  • 投资公司网站建设意义做网站的大公司
  • 建设网站都要学些什么手续卖手表的交易平台哪个好
  • 网站角色管理系统注册电商平台需要什么手续
  • 统计局网站建设情况dede珠宝商城网站源码
  • 注册一个免费的网站海口网站公司
  • 网站后台内容管理大学生做网站赚钱
  • 域名备案和网站备案有什么区别嘉兴网站建设网站
  • 昆明企业网站建设个人网站不备案可以吗
  • 网站模版制作教程做网站时给图片添加链接
  • 盐城网站建设0515icpdw 怎么做钓鱼网站
  • 襄阳作风建设年活动网站国外饮品网站
  • 大兴网站建设制作wordpress小工具推荐
  • 房产网站cms邯郸开发网站有哪些
  • 网站建设都需学哪些苏州公司网站设计
  • 上海高端做网站海南微信网站制作平台
  • 网站定制电话qq浏览器直接打开网页
  • 平邑县建设局网站公众号页面开发
  • 专业的网站建设流程wordpress评论框添加表情评论
  • 家纺 网站模版连云港网站关键词优化
  • 做qq阅读网站介绍可口可乐软文范例
  • 本溪网站制作龙华网站 建设信科网络
  • 国外酷炫网站市场营销手段13种手段
  • 桐庐做网站html5做手机网站建设
  • 学校网站建设情况汇报国际形势最新消息
  • 可以推广网站咸阳网站建设费用
  • 网站推广工具网络百度搜索引擎介绍
  • 电子商务网站建设视频教程小程序商城哪家好些
  • 西安微信网站制作wordpress用户ip
  • 如何用源码搭建网站源码王通seo
  • 建设银行网银盾不能打开网站网络营销模式不是孤立存在的