在drools中,有没有一种方法可以检测无休止的循环并以编程方式停止会话?

在drools中,有没有一种方法可以检测无休止的循环并以编程方式停止会话?,drools,Drools,简言之,我的问题是: 是否有任何内置于drools中的东西允许/方便检测无休止的循环 是否有方法以编程方式停止会话(例如,对于检测到的无止境循环) 更多详情: 我计划让drools(6.2或更高版本)在一个服务器/平台上运行,在这个服务器/平台上,用户将创建并执行自己的规则。我面临的一个问题是,粗心/错误的规则设计很容易导致无止境的循环(无论是被遗忘的“no loop true”语句还是更复杂的rule1触发器rule2触发器rule3(re)触发器rule1循环导致无止境的循环)。 如果发

简言之,我的问题是:

  • 是否有任何内置于drools中的东西允许/方便检测无休止的循环
  • 是否有方法以编程方式停止会话(例如,对于检测到的无止境循环)
更多详情:

我计划让drools(6.2或更高版本)在一个服务器/平台上运行,在这个服务器/平台上,用户将创建并执行自己的规则。我面临的一个问题是,粗心/错误的规则设计很容易导致无止境的循环(无论是被遗忘的“no loop true”语句还是更复杂的rule1触发器rule2触发器rule3(re)触发器rule1循环导致无止境的循环)。 如果发生这种情况,drools基本上会使我的服务器/平台停止运行

我目前正在研究如何检测和/或终止在无止境循环中运行的会话。 现在,作为一个(似乎)无止境的循环本身并不是无效的,或者在某些情况下甚至可能是需要的,我可以想象,对于这种情况,没有很多内置的检测机制(如果有的话)。但由于我不是一个专家,我很高兴知道是否有任何内置的东西来检测无止境的循环? 在我的用例中,我可以根据任何规则可能被激活的频率的阈值来确定会话为“无限循环”。 据我所知,我可以使用AgendaEventListeners来跟踪触发任何规则的频率以及是否满足阈值,或者插入控制事实,或者以某种方式触发包含此会话的drools.halt()的规则

我想知道(并且找不到很多细节)是否可以通过编程方式暂停/终止会话。 我只遇到过一个firuntilhalt()方法,但这似乎不是一个好办法(或者我真的不理解它)

此外,在这一点上,我只计划使用无状态会话(但如果封装良好,我也可以使用有状态会话,如果这使我的目标更容易实现的话)

欢迎对我最初的方法作出任何回答/想法/反馈:)


谢谢

任何RBS实施的根本突破点都是在设计允许“用户创建和设计自己的规则”的地方创建的。我不知道为什么一些市场宣传为非程序员在没有任何保护的情况下编写程序代码打开了大门

检测会话是否停止在理论上是不可能的。谷歌“停止问题”

对于某些上下文,您可能会提出最多可以执行的规则数限制或类似的限制。您可以使用侦听器来计数和引发异常,等等


基本上,一旦你屈服于由业余爱好者创建的未经测试的代码的执行,你就有了非常糟糕的牌

你好,劳恩,谢谢你的反馈。在我看来,疯狂地创建规则的不仅仅是任何“业余”或非程序员。但即使在我们的团队中(由一些经验丰富的程序员组成),我也注意到理解RBS范式的困难。在长时间运行(即服务器类型)的应用程序中运行drools的问题必须足够常见,以保证采用“停止此执行”的方法。最后一个问题:您知道是否有一种程序化的方式来停止无状态会话吗?(或者甚至可以通过drools.halt()在规则中进行尝试……)您可以通过安装侦听器、监视激活并抛出异常来创建一个非常好的紧急停止机制,从而在会话激活过程中进行尝试。或者,您可以调用fireAllRules,并限制点火次数。(这只适用于有状态会话,但这没有问题。)Ciao,我和@Sebastian处于类似的场景中,我使用@laune提到的
fireAllRules(int max)
和阈值。我还希望通过实现某种侦听器来改善这种情况,正如@laune所示,因此,如果您以后还发现了其他替代方案或它的良好实现,@Sebastian,请让我们共享=)thanks@Tari劳恩,谢谢你们,我甚至不知道有限制的消防规则。如果我最终得到了其他或更好的东西,我将对此进行调查并在这里发布。