更多详情:
我计划在用户将创建和执行自己的规则的服务器/平台中运行drools(6.2或更高版本)。我面临的一个问题是粗心/错误的规则设计很容易导致无限循环(无论它只是一个被遗忘的"无循环真实"语句还是更复杂的规则1触发规则2触发规则3 (重新)触发rule1圈,导致无限循环。 如果发生这种情况,drools基本上会减慢我的服务器/平台停止。
我目前正在研究如何检测和/或终止在无限循环中运行的会话。 现在,作为一个(看似)无限循环,没有什么是本身无效的,或者在某些情况下甚至可能需要我可以想象这种情况下没有很多内置的检测机制(如果有的话)。但由于我不是专家,我很高兴知道是否有内置的东西来检测无限循环? 在我的用例中,我可以确定一个会话为"无休止地循环"基于任何规则可能被激活的阈值。 据我所知,我可以使用可跟踪任何规则被触发频率的AgendaEventListeners,如果满足阈值,则插入控制事实或以某种方式触发包含此会话的drools.halt()的规则。
如果可以以编程方式停止/终止会话,我想知道(并且无法找到很多细节)。 我只遇到过fireUntilHalt()方法,但这似乎不太合适(或者我真的不明白)。
此外,此时我只打算使用无状态会话(但如果它被很好地封装,我也可以使用有状态会话,如果这样可以更容易实现我的目标)。
非常欢迎任何对我最初方法的回答/想法/反馈:)
谢谢!
答案 0 :(得分:2)
创建任何RBS实现的基本要点,设计允许“用户创建和设计自己的规则”。我不知道为什么一些营销宣传打开了非程序员编写程序代码的大门,而没有任何保护。
检测会话是否停止在理论上是不可能的。谷歌“暂停问题”。
对于某些上下文,您可能会限制最多可能执行的规则或类似的规则。并且您可以使用侦听器来计算和引发异常等等。
一旦你屈服于执行业余爱好者创建的未经测试的代码,你就会有非常坏卡。