drools - 在多线程环境中使用 Single KieSession 实例安全吗?
问题描述
我在 drools 的帮助下创建了一个规则引擎。到目前为止,我所做的是在服务器启动时,我创建了KieSession
使用该drl
文件的单例实例。我想在多线程环境中使用同一个实例进行多规则评估。
所以我正在做的是,在我的事实准备好之后,我将在kieSession
Fire 规则中插入事实并发布我将从kieSession
.
ExamplePojo examplePojo = new ExamplePojo();
FactHandle insertedFact = kieSession.insert(examplePojo);
kieSession.fireAllRules();
kieSession.delete(insertedFact);
根据KieSession.delete
JavaDoc -
Retracts the fact for which the given FactHandle was assigned regardless if it has been explicitly or logically inserted.
我知道的事情-
- 在多线程场景
kieSession.fireAllRules()
中,即使来自其他线程的事实仍在工作内存中,也可以多次调用 - 我已经测试过,如果两次触发之间的规则没有显式更改,则多次调用
kieSession.fireAllRules()
不会再次对已插入的事实执行规则 kieSession.delete(insertedFact)
从内存泄漏的角度来看是强制性的- 在任何时间点,工作内存中都可能同时存在来自多个线程的事实
我的问题 -
- 这种情况是否会通过一些执行干扰导致规则执行出现故障?
- 如果内存以我使用它的方式泄漏,这会导致任何问题吗?
欢迎各位专家多多指教。我是 Drools 的新手,不知道这样的用例。
解决方案
推荐阅读
- android - android studio 3.6 中存在外部模块问题的项目
- scala - 将 MapPartitionsRDD 转换为 DataFrame 并按 2 个键对数据进行分组
- android - 默认显示 xml 文本和设计
- c++ - 在函数中创建变量并使用引用
- google-sheets - 如何用限制求和(谷歌表格)
- java - 在 Android 上,Class.getResources() 的多个结果是如何处理的?
- android - 如何以编程方式关闭权限对话框?
- sql - 如何从另一列查找值并检查其是否重复,然后在 Oracle SQL 中删除行
- javascript - React - 从道具调用函数
- css - 预加载 typekit 字体 css