在 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 从配置文件为您执行的操作,让我的生活变得复杂。)
我是 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 从配置文件为您执行的操作,让我的生活变得复杂。)