当前位置: 首页 > 知识库问答 >
问题:

无法将具有多个流规则的Kie会话序列化到字节[]

太叔凌龙
2023-03-14

将我的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]

我遇到了什么还不受支持的用例?非常感谢。

共有1个答案

全冥夜
2023-03-14

它只是不为复合故障议程(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'时,我处于停滞状态