JBoss Drools是否真的并行执行所有规则?

时间:2012-05-14 08:45:20

标签: java concurrency drools rule-engine rete

我已经阅读了很多关于JBoss Drools的文档但是找不到关于所有规则是否同时执行的确切答案(当然它们是并发的)。更具体地说,对于单个输入和1000个规则的规则集,在每个规则中执行“when”条件和“then”条件,逐个执行,或者同时并行执行。

一方面,当选择节点被折叠时,rete算法意味着并行性。然而,节点优化后评估顺序? beta内存和连接节点看起来应该同时执行,但它们是不是?

此外,Drools文档提到“顺序模式”,默认情况下这是关闭的。什么是开启,并行模式?并且有一个maxThreads选项暗示线程。

另一方面,我被告知代码不使用线程,因此同时进行评估,但大部分顺序执行。

有没有人见过任何证明这种情况的文件?

谢谢!

2 个答案:

答案 0 :(得分:10)

标准rete算法中没有并行性的迹象。冲突集由匹配的规则产生,然后议程依次应用策略来触发这些规则。

多年来,在匹配或射击阶段,已经进行了许多努力来平行rete的部分。

并行触发所有规则时的一个大问题是确定性执行。

我们目前正在探索Drools中并发和并行匹配的各种策略。我们也将探索并发规则触发,但我们需要找到更强大的方法让用户指出可以并行触发的内容以及不能触发的内容。这样用户就可以在需要的地方获得确定性执行。

答案 1 :(得分:1)

看起来您已经解决了问题,但如果您需要,我仍然可以提供更多信息。在Drools的源代码中使用了一个并发库,显示了github web链接, https://github.com/kiegroup/drools/blob/master/drools-core/src/main/java/org/drools/core/concurrent/ExecutorProviderImpl.java

有些观点,

  1. 当然,线程工厂用于操作执行程序。如果您阅读了此网络链接中显示的源代码,则可以找到该线程库。

  2. 另外你问一下maxThread,Drools中使用的线程池确实有一个池大小,如源代码所示。 newExecutor = new ThreadPoolExecutor( Pool.SIZE, Pool.SIZE, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(), threadFactory );