drools - 可执行模型规则的运行时创建和持久性
问题描述
我们需要在运行时创建和保留规则。目标是创建规则,持久化它们,然后在稍后的时间点重新加载它们。使用从 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 中。
解决方案
要执行规则,它们必须位于特定的 Java 文件中,并且 kjar 需要在 META-INF 文件夹中有一个文件,说明规则的实际位置。
看看这里的maven插件是做什么的
将来可能会有更简单的方法,但我不能告诉你什么时候。
感谢您使用最前沿的功能,祝您好运。
推荐阅读
- python - 在同一程序中使用多个 Tkinter Treeview 样式
- c# - Redis 查询在搜索特定数据时仅显示 10 个结果
- xamarin - skiasharp vsskiasha.views xamarin
- c# - 如何部分覆盖类的某些方法以在 C# 中进行测试,同时保持原始类定义完整?
- api - Google API - 连接到 alteryx 时出现 auth 2.0 错误
- javascript - HTML 元素是否有原型(如 Element.prototype.myFunc)?
- mysql - 如何更改 SQL 查询结果中的某些值?
- javascript - 当浏览器垂直调整大小时,保持 div 在视图中
- flutter - 颤振信息不想出现在屏幕上
- typescript - 模块解析失败:HTMLSelectElement Typescript 上出现意外标记?