无法将具有多个流规则的 KieSession 序列化为字节 []

如何解决无法将具有多个流规则的 KieSession 序列化为字节 []

我在将 KieSession 序列化为 byte[] 时遇到了未实现的情况。我将规则保存在 byte[] 格式的数据库中。

这是我用来创建 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 和处置。这样,我可以重复使用我的 KieSession,而无需在每个 HTTP 请求中插入我的 1K 永久事实,也无需在每个 HTTP 请求之后删除我的 1K 临时事实。这是我用来序列化我的 KieSession代码

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();

我有一个带有 from 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

我在方法 marshall 中收到以下异常:

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 实现,而 CompositeDefaultAgendaMultithreadEvaluationOption.YES 使用。因此,将其设置为 MultithreadEvaluationOption.NO 可以解决问题。

有趣的是,使用我的永久事实(我不想每次都重新插入)从 byte[] 反序列化到 KieSession 比缓存 {{1} },每次都生成一个新的 KieBase 并插入这些永久事实。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?