java - 使用多个并发 KieSession 时出现 NullPointerExceptions
问题描述
我们在 StatelessKieSession 内部处理并发执行环境时面临 NullPointerExceptions。
java.lang.NullPointerException at org.drools.core.impl.StatelessKnowledgeSessionImpl.dispose(StatelessKnowledgeSessionImpl.java:395) at org.drools.core.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:355)
示例代码是
public class ThreadExecutor {
public static void main(String[] args){
ExecutorService submitAsyncPool = Executors.newCachedThreadPool();
Callable<Boolean> processor = new WorkerThread();
for (int i = 0; i < 50; i++) {
submitAsyncPool.submit(processor);
}
}
}
public class WorkerThread implements Callable<Boolean> {
@Autowired
StatelessKieSession kieSession;
@Override
public Boolean call() {
// some code snippet
kieSession.execute(input);
// some code snippet
}
}
这仅发生在规则的并发执行中。StatelessKieSessio
n 在多个线程之间共享并同时执行。其他选择是StatelessKieSession
每次创建我认为非常昂贵的操作。
看起来这是规则引擎的缺陷?有什么解决方法吗?
注意:我们使用的是 Drools 6.x
解决方案
我可以通过将 drools 版本从 6.1.0.Final 升级到 6.2.0.Final 来解决上述错误
我用 6.2.0.Final 执行了相同的测试用例,没有发现问题。
听起来有点奇怪,但它解决了我们的问题。
我希望它可以帮助其他人。
推荐阅读
- c - 看门狗和电压控制不工作微控制器[AVR128DB48 Curiosity Nano]
- push - 我使用了 gcc 优化(优化大小)。调用 push_back 会导致硬故障。为了解决硬故障,我应该用什么替换 push_back?
- java - 将给定数组的元素向右旋转 k 次
- scala - Spark Scala 单元测试失败
- fiware - 如何通过FIWARE ORION CONTEXT BROKER批量(例如每1分钟)将传感器时间序列数据处理到时间序列数据库(例如CrateDB)?
- linux - 使用参数运行 Node_Exporter 服务
- javascript - React:如何让提交按钮和文本标签相互通信?
- bash - 使用 bash 在图形模式下对文件进行排序
- java - java.lang.IllegalArgumentException:比较方法违反了它的一般约定,java.base/java.util.TimSort.mergeCollapse
- powershell - “Powershell Banner Outbound”的含义(Suricata)