我在Spring Boot应用程序中使用以下drools配置文件从DataBase加载/执行规则,该数据库在本地运行良好但是当我尝试将应用程序部署到服务器时,我收到一条错误消息,说没有找到KieModule Bean 。我将缺少的KieModule Bean添加到我的配置文件中,现在我又收到了另一个错误Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.RuntimeException: Cannot find KieModule: org.default:artifact:1.0.0-SNAPSHOT
。我的问题是1)为什么我需要这个Bean和2)为什么应用程序在没有缺少Bean的情况下在本地构建/运行?
如果它是部署应用程序所需的必需Bean,我是否需要通过向我的应用程序/ POM添加一些属性来专门为我的环境配置它?
public class DroolsDataBaseConfig {
@Autowired
private DataService dataService;
@PostConstruct
public void loadResourcesFromDatabase() {
try {
KieHelper helper = getKieHelper();
List<Rule> rulesFromDB = dataService.findAllRules();
for (Rule rule : rulesFromDB){
String ruleAsStr = rule.getRule();
helper.addContent(ruleAsStr, ResourceType.DRL);
}
helper.build(getKieServices().newKieBaseConfiguration());
} catch (Exception ex) {
log.error("Exception occured loading rules from Database. Exception is : " + ex);
}
}
@Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository();
return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
@Bean
@ConditionalOnMissingBean(StatelessKieSession.class)
public StatelessKieSession statelessKieSession() throws IOException {
return kieContainer().newStatelessKieSession();
}
private KieServices getKieServices() {
return KieServices.Factory.get();
}
@Bean
@ConditionalOnMissingBean(KieHelper.class)
public KieHelper getKieHelper() throws IOException {
return new KieHelper();
}
@Bean
@ConditionalOnMissingBean(KieModule.class)
public KieModule kieModule() throws IOException {
return new KieModule() {
public ReleaseId getReleaseId() {
return getKieServices().getRepository().getDefaultReleaseId();
}
};
}
@Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
}
答案 0 :(得分:1)
正如评论中所暗示的,这是一个Drools编译问题! 在日志中,我得到:
KieProject - Unable to build KieBaseModel:defaultKieBase
[3,14]: [ERR 107] Line 3:14 mismatched input 'java' expecting one of the following tokens: '[package, unit, import, global, declare, function, rule, query]'.
该消息不会将您引向确切的错误,而是将您引向一般区域。我检查了导入部分,将导入放在一个单元格中,然后在要导入的软件包列表中,再次输入了“ import”关键字。我已对其进行了更正,以使其与在线示例匹配,然后电子表格就会编译!
答案 1 :(得分:0)
KModule 已在应用程序上部署并启动,应用程序在启动时需要它。
应用服务和 Wildfly(业务中心)都应该访问部署了 KieModule 的同一个存储库。如果它们在不同的机器上运行,您可以创建一个远程存储库或由不同用户在同一台机器上运行它们的服务,那么您应该在 kie-server 服务所有者的 .m2 目录中创建一个 setting.xml 文件。
您应该在 setting.xml 文件中定义需求本地和远程存储库。