从 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(接口)开始,然后回溯到实现,事情就开始变得有意义了。
我正在尝试评估创建 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(接口)开始,然后回溯到实现,事情就开始变得有意义了。