Java 使用ksession.retract时出现锁定问题
我目前有流口水的问题(5.6)。我们试图让我们的规则引擎安全地崩溃和死锁,但由于我们允许用户直接输入drools规则,这有点困难 我们当前的问题是:当把一些东西放在条件部分时,比如Java 使用ksession.retract时出现锁定问题,java,drools,Java,Drools,我目前有流口水的问题(5.6)。我们试图让我们的规则引擎安全地崩溃和死锁,但由于我们允许用户直接输入drools规则,这有点困难 我们当前的问题是:当把一些东西放在条件部分时,比如eval(myAPI.myMethod(“abc”)引发异常。但是,这会导致流口水后不顺畅 当我们试图让一切恢复正常时(收回对象和事实句柄并从数据库重新加载它们,在数据库中我们不断地保持ksession),我们会遇到一个锁问题: 调用ksession.retract(eventObject)时什么也没发生,调试显示它被
eval(myAPI.myMethod(“abc”)代码>引发异常。但是,这会导致流口水后不顺畅
当我们试图让一切恢复正常时(收回对象和事实句柄并从数据库重新加载它们,在数据库中我们不断地保持ksession),我们会遇到一个锁问题:
调用ksession.retract(eventObject)时代码>什么也没发生,调试显示它被锁定在NamedEntryPoint.retract(…):548中的“this.lock.lock()”处
我试过很多方法来规避这个问题,但我不知道怎么做。外面有没有人,也许有答案?像一些限制锁定时间的配置参数,一些允许手动解锁的方法,或者一些允许完全关闭当前会话的方法(dispose不是一个选项,正如它所说的,如果在清理所有内容之前不使用它,可能会导致内存泄漏)
有什么想法吗?感谢和问候,
Kay为什么eval(myAPI.myMethod(“abc”)
首先要(或被允许)抛出异常?在代码中抛出一个异常,该异常应该从某些Pojo中的数据中生成布尔值,除非发生完全不可预见的事情,表明您的应用程序处于困境或穷途末路,没有恢复的机会。我知道,这些方法不应该导致任何异常,但由于我们允许开发人员使用我们的API,它具有数据库访问等功能,我们需要确保缺少的参数(空参数、缺少的参数、错误的参数类型,如不存在的枚举项等)不会导致任何问题。我们目前正在重新编写API,因此引发的异常较少,但由于某些原因,我们无法避免所有异常(例如,如果开发人员无法访问他试图在那里使用的方法)。因此,如果我们能够以某种方式避免这个“异常崩溃流口水”的问题,那将是一件非常棒的事情……这是一个第22条军规。也许您可以通过提供一个包装器boolean failsafe(boolean b)
来逃脱,该包装器捕获myMethod&comp抛出的所有异常。此方法应捕获、设置标志、记录并返回false。在所有的插入、删除、收回之后:检查标志并撤销所做的一切。这将使发动机处于一致的状态,而您“只”剩下纠正这最后一次事故的问题。-你不可能一个例外地跳出火海,期望一切都干净稳定。