Drools用户手册翻译——第四章 Drools规则引擎(七)规则执行模式和线程安全

news2024/11/23 9:55:00

甩锅声明:本人英语一般,翻译只是为了做个笔记,所以有翻译错误的地方,错就错了,如果你想给我纠正,就给我留言,我会改过来,如果懒得理我,就直接划过即可。  

 

drools的规则执行模式和线程安全

Drools支持下面的规则执行模式,这些模式决定了Drools如何以及何时执行规则:

  • 被动模式:(默认)当用户或者应用明确调用了fireAllRules方法时,Drools会评估规则。Drools的被动模式对于需要直接控制规则评估和执行的应用程序,或者对于使用伪时钟实现的复杂的事件处理(CEP)应用程序来说都是是最好的。

被动模式的CEP应用程序代码示例

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );
KieSession session = kbase.newKieSession( conf, null );
SessionPseudoClock clock = session.getSessionClock();

session.insert( tick1 );
session.fireAllRules();

clock.advanceTime(1, TimeUnit.SECONDS);
session.insert( tick2 );
session.fireAllRules();

clock.advanceTime(1, TimeUnit.SECONDS);
session.insert( tick3 );
session.fireAllRules();

session.dispose();
  • 主动模式:如果用户或者应用程序调用fireUntilHalt方法,Drools会启动主动模式并持续的评估规则,直到用户或者应用程序调用halt方法。主动模式对于将规则的评估和执行委托给Drools的应用程序,或者使用实时时钟实现的CEP程序来说是最好的。主动模式对于使用主动查询的CEP应用程序是可选的。

主动模式的示例CEP应用代码

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();
config.setOption( ClockTypeOption.get("realtime") );
KieSession session = kbase.newKieSession( conf, null );

new Thread( new Runnable() {
  @Overridepublic void run() {
      session.fireUntilHalt();
  }
} ).start();

session.insert( tick1 );

... Thread.sleep( 1000L ); ...

session.insert( tick2 );

... Thread.sleep( 1000L ); ...

session.insert( tick3 );

session.halt();
session.dispose();

这个例子启用了一个专门的线程调用fireUntilHalt方法,启用专门的线程是为了防止drools在评估规则时当前线程无休止的被阻塞。这个专门的线程也可以在之后的阶段调用halt方法。

尽管你应该避免同时调用fireAllRules方法和fireUntilHalt方法,尤其是来自不同线程的调用,但是Drools是可以处理这种情况的,处理方法就是使用安全线程逻辑和一个内部的状态机。如果fireAllRules方法正在调用的同时,你又调用fireUntilHalt方法,drools会使用被动模式继续运行,直到fireAllRules方法操作完成,然后启用主动模式用来响应fireUntilHalt的调用。但是,如果drools是以主动模式下调用fireUntilHalt,同时你调用了fireAllRules方法,这个fireAllRules方法调用会被忽略,drools会继续以主动模式运行,直到你调用了halt方法。

为了在主动模式下添加线程安全,drools支持submit方法,你可以使用submit方法对线程安全中的kie会话进行分组和操作,原子操作:

在主动模式下使用submit方法执行原子操作的应用代码示例

KieSession session = ...;

new Thread( new Runnable() {
  @Overridepublic void run() {
      session.fireUntilHalt();
  }
} ).start();

final FactHandle fh = session.insert( fact_a );

... Thread.sleep( 1000L ); ...

session.submit( new KieSession.AtomicAction() {
  @Overridepublic void execute( KieSession kieSession ) {
    fact_a.setField("value");
    kieSession.update( fh, fact_a );
    kieSession.insert( fact_1 );
    kieSession.insert( fact_2 );
    kieSession.insert( fact_3 );
  }
} );

... Thread.sleep( 1000L ); ...

session.insert( fact_z );

session.halt();
session.dispose();

从客户端视角来看,线程安全和原子操作也是有帮助的。例如,你可能需要在给定时间内插入不止一条事实,但是需要drools去考虑将插入作为原子操作,并且等到所有插入完成之后,再次评估规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/801867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HighTec 工程属性介绍2

目录 首先需要创建或导入一个工程,如下图: 有两种方式可以进入工程的属性面板: 选中工程,右键点击 Properies . 选中工程,按键 Alt Enter. 进入工程属性面板之后,左侧是书签标记,右侧是该书…

How to choose WIFI7 IPQ9554- WIFI6 IPQ8072? Who has the better performance?

How to choose WIFI7 IPQ9554- WIFI6 IPQ8072? Who has the better performance? The Wi-Fi standard is Wi-Fi 6, also known as 802.11ax. Wi-Fi 6 brings significant speed, capacity and performance improvements over the previous Wi-Fi 5 (802.11ac) standard. It p…

如何做好项目管理?年薪百万项目大佬一直在用这11张图!

日常工作中,我们会遇到各种大大小小的工作项目,如何能让项目保质保量的完成,就需要项目管理。项目管理是什么?一句话解释:在有限的时间内,在约束的范围中,集合有限资源来完成项目目标。 本周小编…

如何安装mmcv?官网解答

pip install -U openmim mim install mmcv

什么是宏变量和宏替换?

在Java中,宏变量和宏替换通常是与C/C预处理器相关的概念,而不是Java本身的特性。在Java中,我们通常不使用预处理器指令(例如宏定义)来进行代码替换。Java使用的编译器并不支持预处理器指令,因此没有宏替换的概念。 然而&#xff0…

移动硬盘文件或目录损坏且无法读取

早上插上硬盘,拔的时候不太规范,再插进去就显示无法读取了 搜了很多方法,很多让使用什么软件进行恢复 还参考了这个方法,但是我的属性打开跟博主的完全不一样 最后,参考移动硬盘“文件或目录损坏,无法读取…

[NOIP2007 普及组] 守望者的逃离

[NOIP2007 普及组] 守望者的逃离 题目背景 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。 题目描述 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。 为了杀死守望者,尤迪安开始…

把一个列表拆成N个子列表的四种方法

编程的方法往往不止一种,比如怎么把一个Python种的列表拆成N个子列表,我们可以很容易找到N种方法,也许这就是编程的魅力所在。 一、列表表达式法 这种方法最为简洁,不过可读性差一些 这个方法中,即使原始列表的数量无…

途乐证券:美联储第11次加息 年内降息预期下降

7月26日,美国联邦储藏委员会主席鲍威尔在华盛顿到会记者会。新华社发 当地时刻7月26日,美国联邦储藏委员会一如预期加息25个基点。商场对美联储未来是否会持续加息尚未彻底构成共识,但对年内美联储将敞开降息周期的预期下降。 抑通胀 美联储…

24考研数据结构-队列2

目录 数据结构之队列:链式存储结构与循环队列链式存储结构链式队列的结构链式队列的操作 循环队列循环队列的结构循环队列的操作 链式队列与循环队列的比较结论3.2.3 队列的链式存储结构3.2.3.1定义3.2.3.2链式队列的基本操作——带头结点3.2.3.3 不带头结点的相关操…

PLC自学是否可行?

plc编程的关键是模拟原操作流程,通过运行程序完成控制过程。所以核心内容就是程序对流程的描述。因此,掌握PLC编程语言和基本功能实现是很有必要的。 PLC语言分为梯形图、语句和功能图。常用梯形图,适合基本逻辑描述,语句表适合数…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

商品分类子类新建,手机云进销存,扫码入库出库盘点开单打印

商品分类子类新建,手机扫码开单打印进销存,商贸批发生产企业仓库条码管理软件系统,超市便利店五金茶叶烟酒鞋帽门店零售手机收银管理软件APP_哔哩哔哩_bilibili商品分类子类新建的操作步骤。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 …

Java基础---final 关键字

目录 定义: 用途: 使用注意事项: final 变量 final 方法 final 类 小结 定义: Java中,final 表示最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思 用途&#xff…

springboot+mybatis多数据源的事务问题

1.springbootmybatis实现多数据源后,针对单个数据源我们可以使用Transactional(name"xxxTransactionManager") 来指定使用的事务管理器,但是如果被注解的方法需要同时支持两个事务管理器呢,这个时候如果用Transactional注解就不 …

设备数字化平台在制药行业数字化转型的思考与实践

近年来,全球制药行业正面临着数字化转型的浪潮。制药4.0的概念正引领着工业物联网、机器人流程自动化和人工智能等先进技术在制药行业的广泛应用。然而,尽管数字化转型在许多行业已经取得了巨大成功,制药行业仍然面临一些挑战。数据孤岛、人才…

git撤销上一次的commit

一行命令 git reset --soft HEAD^如果在vscode上面,就可以

路灯防雷测试标准方案

路灯作为城市照明的重要组成部分,不仅影响着城市的美观和安全,也涉及到城市的节能和环保。因此,路灯的质量和性能是非常重要的。而路灯由于其安装位置和工作环境的特殊性,很容易受到雷击的影响,导致路灯的损坏或故障。…

Sanic 是什么?从原理到实践,全面解析 Sanic 框架的奥秘

在 Python 中,有许多 Web 框架可以帮助开发者构建高性能的异步 Web 应用程序。其中,Sanic 是一款基于 Python 的异步 Web 框架,它提供了快速、简洁和灵活的方式来构建高性能的 Web 应用程序。本文将介绍 Sanic 框架的基本概念、特点和优势&am…

忘记安卓图案/密码锁如何解锁?

如何解锁Android手机图案锁?如何删除忘记的密码?Android 手机锁定后如何重置?这是许多智能手机用户在网上提出的几个问题。为了回答这些问题,我们想出了一些简单有效的方法来解锁任何设备而不丢失数据。 忘记手机密码可能会令人恐…