Drools 可执行模型规则的运行时创建和持久性

Drools 可执行模型规则的运行时创建和持久性,drools,Drools,我们需要在运行时创建并保持规则。目标是创建规则,将其持久化,然后在稍后的时间点重新加载。通过使用drools单元测试拼凑而成的代码片段,我可以成功地从DRL字符串创建规则,然后将它们保存到kjar。使用新的KieBuilder.buildAll重载,kjar(大概)是使用新的可执行模型构建的。所有这些似乎都奏效了 但我真正想做的是完全消除DRL字符串,并在运行时使用流或模式DSL创建规则。同样,使用示例代码,我可以在运行时创建这些规则,并在会话中执行它们。我似乎不能做的是将它们作为一个kjar(

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

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

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

Rule rule = getRule();   
ModelImpl model = new ModelImpl().addRule( rule );  
KieBase kieBase = KieBaseBuilder.createKieBaseFromModel( model );  
但是我需要能够持久化新创建的基库,以便以后可以重新加载它。而且似乎没有一个可行的方法来做到这一点

有什么建议吗?我正在使用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,那么所有这些问题都可以为我解答


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

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

看看maven插件在这里做什么

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


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

到目前为止,你写了什么?我遵循了可用的示例/单元测试,这些示例/单元测试使用DSL创建了一个规则。将该规则添加到模型中,然后根据该规则创建基库:Rule Rule=getRule();modeleImpl model=new modeleImpl().addRule(规则);KieBase KieBase=KieBaseBuilder.createKieBaseFromModel(model);请尝试在问题中包含您的代码。创建KieBase是最简单的部分。我的问题是关于你如何坚持这个基础?很抱歉格式化…我似乎无法掌握Stackoverflow格式化的窍门:(IIsn)kjar不是一种很好的序列化方法吗?