从 KieBase 和 KieContainer 创建 KieSession 有什么区别?

What is the difference between creating a KieSession from a KieBase and a KieContainer?

我正在尝试评估创建 KieSession 的最佳选择。

选项 1

kiebase.newKieSession();

选项 2

container = kieHelper.getKieContainer();
container.newKieSession()

我找不到两者之间的区别。有任何输入吗?

正如 JavaDoc 中所解释的那样,它们根本不同。

方法 kieContainer.newKieSession() returns 此容器的默认 KieSession 。如果容器没有定义默认会话,它将抛出 RuntimeException。

方法kieBase.newKieSession()为这个KieBase创建一个新的KieSession,遵循默认配置

由于 KieContainer 包含 KieModule 的所有 KieBase,因此两种方法都可能解析为类似的 KieSession。当然,您需要有一个仅包含单个 KieBase 的 KieContainer,并且容器的默认会话必须使用单个 KieBase 的默认配置会话进行初始化。

考虑这个配置(与问题无关的字段被省略,因此它不是有效的 kmodule.xml,显然):

<kmodule>
  <kbase name="foo">
    <ksession name="fooSession" type="stateless" default="true">
  </kbase>
  <kbase name="bar">
    <ksession name="barSession" type="stateless">
  </kbase>
</kmodule>

在这里,如果我们调用 kieContainer.newKieSession(),我们将取回名为 'fooSession' 的 kieSession,因为它被配置为默认值。类似地,如果我们调用 kieBase.newKieSession() 并且 kieBase 是名为 'foo' 的那个,我们也会得到一个类似 'fooSession' 的 kieSession。但是如果 kieBase 是名为 'bar' 的会话,那么会话将类似于 'barSession'。

在弄清楚 Drools 的工作原理时,除了文档之外,有时还可以查看 source code。开始时有点复杂,但如果您从 API(接口)开始,然后回溯到实现,事情就开始变得有意义了。