在 drools 中以编程方式配置 kie 模块时添加规则文件

Adding rule file when configuring kie module programmatically in drools

我是 Drools 的新手,正在尝试创建一个基于 Drools 的 java 应用程序。 我决定以编程方式创建一个 Kie 模块,而不是编写 XML 文件。为此,我有以下配置

@Configuration
public class KieContainerConfig {

    private static String drlFile = "com/rules/eligibility.drl";

    @Bean
    public StatelessKieSession kieSession() {

        KieServices kieServices = KieServices.Factory.get();
        KieModuleModel kieModuleModel = kieServices.newKieModuleModel();

        KieBaseModel kieBaseModel1 = kieModuleModel.newKieBaseModel("KBase1 ")
                .setDefault(true)
                .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
                .setEventProcessingMode(EventProcessingOption.STREAM)
                .addPackage(drlFile); // adding drl file


        kieBaseModel1.newKieSessionModel("KSession1")
                .setDefault(true)
                .setType(KieSessionModel.KieSessionType.STATELESS)
                .setClockType(ClockTypeOption.get("realtime"));

        KieFileSystem kfs = kieServices.newKieFileSystem();

        kfs.writeKModuleXML(kieModuleModel.toXML());

        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
        List<Message> messages = kieBuilder.getResults().getMessages(Message.Level.ERROR);
        if (!messages.isEmpty()) {

            for (Message err : messages) {
                System.err.println(err);
            }
        }

        KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());


        return kieContainer.newStatelessKieSession("KSession1");}

但是当我 运行 代码时,应用程序发出 java.lang.RuntimeException: Unexpected globa 错误。但是,当我通过删除 .addPackage(drlFile); 并将 kfs.write(ResourceFactory.newClassPathResource(drlFile)); 添加到 KieFileSystem 来更改代码时,代码 运行s 并提供预期的结果。

为什么我在创建 Kie Base Model 而不是使用 Kie File System 的 write 方法时不能提及包?

根据 KieBaseModel 的 Javadoc,addPackage 方法采用一种模式。最常见的是这样使用:

KieBaseModel model = ...
    .addPackage("*");

但是如果您将规则组织成包,则可以像这样将包添加到模型中:

KieBaseModel model = ...
    .addPackage("org.mycompany.rules");

您的备选方案是使用类路径资源来添加单个文件。

(我建议使用 XML 配置您的系统。我也构建了 Spring 和 Spring-使用 drools 启动应用程序,并且从未见过需要过度-通过手动执行这些 Drools 从配置文件为您执行的操作,让我的生活变得复杂。)