将我的KieSession序列化为字节[]时,我遇到了一个未实现的情况。我以字节[]格式将规则保存在数据库中。
下面是我用来创建KieSession的一段代码:
KieServices kServices = KieServices.Factory.get();
KieFileSystem kFileSystem = kServices.newKieFileSystem();
for(byte[] arr : myRules) {
String fileName = "/src/main/resources/" + generateRandomRuleName();
kFileSystem.write(fileName , new ByteArrayResource(arr ));
}
kServices.newKieBuilder(kFileSystem).buildAll();
我有大约1K个永久事实,当向我的Spring Boot应用程序发出HTTP请求时,我需要复制我的KieSession字节,将其反序列化为KieSession,插入大约1K个临时事件、fireAllRules和dispose。这样,我就可以重用我的KieSession,而无需在每个HTTP请求上插入我的1K永久事实,也无需在每个HTTP请求后删除我的1K临时事实。下面是我用来序列化会话的代码:
KieBaseConfiguration configuration = KieServices.Factory.get().newKieBaseConfiguration();
configuration.setOption(MultithreadEvaluationOption.YES);
configuration.setOption(EqualityBehaviorOption.EQUALITY);
configuration.setOption(EventProcessingOption.STREAM);
KieBase kBase = kServices
.newKieContainer(kServices.getRepository().getDefaultReleaseId())
.getKieContainer()
.newKieBase(configuration);
final KieSession kSession = kBase.newKieSession();
// myListOfPermanentFacts is an array of serializable Java objects, but not declared with @role ( fact )
kSession.execute((Command<?>) CommandFactory.newInsertElements(myListOfPermanentFacts));
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MarshallerFactory.newMarshaller(kBase).marshall(outputStream, kSession);
outputStream.close();
byte[] kSessionBytes = outputStream.toByteArray();
当我使用collect中的单个规则时,如下所示:
rule "Rule_1"
dialect "java"
no-loop true
when
obj : MyObj( field1: field1 )
List( size >= 3 ) from collect ( MyObj( field1 == field1, this before obj ) )
then
obj.someMethod( "string1" );
end
上述用例按预期工作。然而,当我有第二条规则(非常相似)时:
rule "Rule_2"
dialect "java"
no-loop true
when
obj : MyObj( field2: field2 )
List( size >= 3 ) from collect ( MyObj( field2 == field2, this before obj ) )
then
obj.someMethod( "string2" );
end
我在方法马歇尔
中收到以下异常:
java.lang.UnsupportedOperationException: org.drools.core.common.CompositeDefaultAgenda.getActivations -> TODO
at org.drools.core.common.CompositeDefaultAgenda.getActivations(CompositeDefaultAgenda.java:386) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
at org.drools.core.marshalling.impl.ProtobufOutputMarshaller.evaluateRuleActivations(ProtobufOutputMarshaller.java:268) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
at org.drools.core.marshalling.impl.ProtobufOutputMarshaller.serializeSession(ProtobufOutputMarshaller.java:135) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
at org.drools.core.marshalling.impl.ProtobufOutputMarshaller.writeSession(ProtobufOutputMarshaller.java:115) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
at org.drools.core.marshalling.impl.ProtobufMarshaller.marshall(ProtobufMarshaller.java:120) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
at org.drools.core.marshalling.impl.ProtobufMarshaller.marshall(ProtobufMarshaller.java:104) ~[drools-core-7.28.0.Final.jar:7.28.0.Final]
我遇到了什么还不受支持的用例?非常感谢。
它只是不为复合故障议程(CompositeDefaultAgenda)实现,而复合故障议程(CompositeDefaultAgenda)由多线程评估选项(multi-threadevaluationoption)使用。是。因此,将其设置为多线程评估选项。否解决此问题。
有趣的是,从byte[]
到具有我的永久事实(我不希望每次都重新插入)的Kiesion
的反序列化比缓存KieBase
慢得多,生成一个新的Kiesion
并每次都插入这些永久事实。
在规则执行期间,我将在内存中“插入”新的事实对象,当规则触发完成时,我需要读取这些对象。在规则课程之外,我如何阅读这些事实? 我尝试过从会话外部(即在“fire All规则()”方法之前)使用outIdfier插入事实。但是,因为我可能不知道在规则会话期间可能会插入多少Account ing周期事实,或者即使它会被插入,这种方法似乎不合适。 会计期间事实: 执行代码: 我的规则。drl公司
到目前为止,我还不知道在Drools 6.0.0中向正在运行的Kie会话添加规则并仍然将我的事实保存在Kie会话中的最佳方法(意味着以最小的开销)。在Drools 5中,当KBase更改时,K会话会更新,但Drools 6似乎并非如此,因为我的规则不是在KieBase中创建的。有没有一种方法可以在不更换KieFileSystem中的整个KieModules或Jars的情况下做到这一点。我认为应该有
“您可以决定创建多个会话...如果出于可伸缩性的原因需要多个会话。”
我正在使用drools Version6.0.0.Final做一个示例hello world maven项目。下面是我的pom文件的构建,我已经指定了kie-maven-plugin,但是我可以注意到这个插件不能被执行。我是不是漏掉了什么。
我应该实现Serializable接口来解决这个问题吗? 错误日志: 代码:
我有一个清单 我想要一本像下面这样的字典 我尝试为new_dict创建一个列表为key_list: 然后,我尝试对和使用嵌套循环,但当我看到列表中的'l'和'd'时,我处于停滞状态