首页 > 解决方案 > 可执行模型规则的运行时创建和持久性

问题描述

我们需要在运行时创建和保留规则。目标是创建规则,持久化它们,然后在稍后的时间点重新加载它们。使用从 drools 单元测试拼凑起来的代码片段,我可以成功地从 DRL 字符串创建规则,然后将它们保存到 kjar。并且使用新的 KieBuilder.buildAll 重载,kjar(大概)是使用新的可执行模型构建的。所有这些似乎都奏效了。

但我真正想做的是完全消除 DRL 字符串,并在运行时使用流或模式 DSL 创建我的规则。同样,使用示例代码,我可以在运行时创建这些规则,并在会话中执行它们。我似乎无法做的实际上是将它们作为 kjar (或我可以设计的任何其他形式)保存。似乎使用流或模式 DSL 构建规则的最终结果是 KieBase。而且似乎没有办法序列化或持久化 KieBase。在此过程中的某个时刻,我需要能够 getBytes() 以保持 KieBase。

例如,我可以像这样创建 KieBase:

Rule rule = getRule();   
ModelImpl model = new ModelImpl().addRule( rule );  
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel( model );  

但是我需要能够持久化新创建的 kieBase 以便以后重新加载它。而且似乎没有可行的方法来做到这一点。

有什么建议么?我正在使用 7.7.0 进行测试。

更新 2018-07-23

让我用更多信息来澄清我原来的问题。实际上有两个用例我想使用新的可执行模型在 Java 中编写规则:1)在设计时;2) 在运行时。每个用例的要求都略有不同,到目前为止,我未能让其中任何一个完全工作。

对于第一个用例,在设计时我需要能够在 Java 中编写规则(使用新模式 DSL),然后将这些规则保存到 kjar。在那里,它们可以被加载到 KieServer 实例中并执行。据称 Kie Maven 插件可以做到这一点,我尝试按照 drools 文档中的说明进行操作(例如 7.8.0 文档的第 2.2.1.4 节)。但是这些说明似乎不完整,并且没有任何示例说明如何完成此操作。需要将哪些文件或文件添加到 resources\META-INF 文件夹以识别规则?Java 代码中的规则实际上是如何公开的?他们需要在特定类型的班级中吗?规则是从公共方法返回的吗?这些方法是如何被识别为有规则的?是否需要任何 Java 注释来完成这项工作?

如果只有一个简单的端到端示例演示了如何在 Java 中编写规则并创建包含该规则的 kjar,那么所有这些问题都将为我解答。

对于第二个用例(实际上这两个用例对我来说更重要),我需要能够在运行时动态创建规则。根据我们应用程序中的配置数据,需要以编程方式创建多个规则并最终将其加载到 KieServer 实例中。我的假设是该过程类似于用例 #1,其中可以以编程方式创建一个 kjar,然后将其加载到 KieServer 中。请记住,在这种情况下,Maven 插件不在图片中,因为这一切都是在运行时完成的,而不是设计时。使用可执行模型的示例(主要是单元测试),我可以用 Java 编写规则并执行它们。但是我发现没有办法从它们实际构建一个 kjar,或者直接将它们加载到 KieServer 中。

标签: drools

解决方案


要执行规则,它们必须位于特定的 Java 文件中,并且 kjar 需要在 META-INF 文件夹中有一个文件,说明规则的实际位置。

看看这里的maven插件是做什么的

https://github.com/kiegroup/droolsjbpm-integration/blob/master/kie-maven-plugin/src/main/java/org/kie/maven/plugin/GenerateModelMojo.java#L165

将来可能会有更简单的方法,但我不能告诉你什么时候。

感谢您使用最前沿的功能,祝您好运。


推荐阅读