我们需要在运行时创建和保留规则。目标是创建规则,保留规则,然后在以后的某个时间重新加载它们。使用从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中的方法。
答案 0 :(得分:1)
要执行规则,它们必须位于特定的Java文件中,并且kjar需要在META-INF文件夹中包含一个文件,说明规则的实际位置。
看看这里的Maven插件在做什么
将来可能会有一种更简单的方法,但是我不能告诉您何时。
感谢您使用前沿功能,并祝您好运。