Drools KieContainer returns null KieSession

Drools KieContainer returns null KieSession

我正在尝试 运行 Drools 文档中的示例。我有以下代码。

KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer("droolspoc");
KieSession kieSession = kieContainer.newKieSession("HelloWorld");

kieSession.addEventListener(new DebugAgendaEventListener());
kieSession.addEventListener(new DebugRuleRuntimeEventListener());

// Create the fact
final Message message = new Message("Hello World", Message.HELLO);
kieSession.insert(message);

kieSession.fireAllRules();

kieContainer.newKieSession总是returns空。我发现了一些关于会话需要 XML 配置文件的讨论。示例中提到了 None 个。

我在我的类路径中添加了一个 kmodule.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <kbase name="droolspoc" packages="rules">
        <ksession name="HelloWorld"/>
    </kbase>
</kmodule>

我仍然收到空会话。我错过了什么吗?

kmodule.xml 文件需要位于类路径中名为 META-INF 的文件夹中。

如果这是一个 Maven 项目,您会因此希望 XML 文件位于 src/main/resources/META-INF/kmodule.xml。如果使用其他构建系统或手动配置类路径,请确保 META-INF 路径存在。

另请注意,在您的 kbase 定义中描述的规则包是相对于类路径根的,而不是相对于 META-INF。因此,如果您将 kbase 描述为 <kbase name="foo" packages="rules.foo.fun">,那么您的规则文件应位于 <classpath>/rules/foo/fun.