目前我将所有规则文件存储在文件系统上(它们有很多版本)并在启动时将它们的不同版本加载到内存中。我想更改为将我的drools文件存储在数据库中,并想知道Drools是否有任何解决方案或插件可以促进这一点,还是应该自行制作?
感谢。
答案 0 :(得分:7)
是的,可以做到。你只需要获得InputStream
的能力。在我的例子中,我使用自己的JPA类RulePackage
将规则源持久化为byte [],但你可以使用直接JDBC连接来访问BLOB / CLOB字段在您的数据库架构中。重要的是保存存储的规则源类型,在构建规则包时需要它:
switch(rulePackage.getRuleSourceType()) {
case DRL:
kbuilder.add( ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DRL);
break;
case EXCEL:
kbuilder.add( ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, excelConfig);
break;
case CSV:
kbuilder.add( ResourceFactory.newByteArrayResource(rulePackage.getSource()), ResourceType.DTABLE, csvConfig);
break;
default:
throw new Exception("Rule package '" + rulePackage.getName() + "' has unknown type");
}
如果在您的情况下更适用,您可以考虑使用newInputStreamResource方法:
case DRL:
kbuilder.add( ResourceFactory.newInputStreamResource(new StringInputStream(myDrlAsString)), ResourceType.DRL);
break;
或
case DRL:
kbuilder.add( ResourceFactory.newInputStreamResource(new ByteArrayInputStream(myDrlAsByteArr)), ResourceType.DRL);
break;
类似的东西。
答案 1 :(得分:4)
是的,您可以通过创建规则包(.pkg文件)来实现。这是文本规则的编译/二进制形式。
您可以在创建knowledgeBuilder时指定包文件的名称,以及更新规则的频率(例如30秒)。
使用Guvnor将文本规则转换为.pkg文件。将此文件保存在应用程序可以访问它的文件夹中。
如果您需要代码示例,请恢复。
答案 2 :(得分:3)
好吧,您可能希望将Guvnor视为提供规则管理的一种方式。
但简而言之,不,你必须自己编写。
请记住,中间不需要文件,您可以从db中读取规则的字符串表示,然后编译它。
答案 3 :(得分:1)
我也面临同样的情况。 我将所有规则文件存储在数据库中。
在应用程序启动时加载规则时,我从数据库中获取规则并将它们存储在临时文件夹中以进行编译并将它们放入规则库中。
如果您的规则在运行应用程序期间发生更改,请以相同的方式更新规则库中已更改的规则。
答案 4 :(得分:0)
一旦您开始在数据存储中存储多个版本的规则,您实际上正在寻找Guvnor(在Drools 5.x中)或Drools-WB / KIE-WB的业务规则管理(BRMS)功能Drools 6.0中的工作台。
这些解决方案已经解决了开箱即用的多个规则版本的版本控制,存储和部署问题。简而言之,它们将比本土解决方案更强大。