无法将具有多个流式传输规则的 KieSession 序列化为字节 []
Cannot Serialize KieSession with multiple streaming rules to byte[]
在将我的 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 启动应用程序的 HTTP 请求,我需要复制我的 KieSession
字节,将其反序列化为 KieSession
插入 ~ 1K 临时事件,fireAllRules 和 dispose。这样,我可以重用我的 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
实现,CompositeDefaultAgenda
被 MultithreadEvaluationOption.YES
使用。因此将其设置为 MultithreadEvaluationOption.NO
即可解决问题。
有趣的是,使用我的永久事实(我不希望每次都重新插入)从 byte[]
反序列化到 KieSession
比缓存 KieBase
,每次都生成一个新的 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 启动应用程序的 HTTP 请求,我需要复制我的 KieSession
字节,将其反序列化为 KieSession
插入 ~ 1K 临时事件,fireAllRules 和 dispose。这样,我可以重用我的 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
实现,CompositeDefaultAgenda
被 MultithreadEvaluationOption.YES
使用。因此将其设置为 MultithreadEvaluationOption.NO
即可解决问题。
有趣的是,使用我的永久事实(我不希望每次都重新插入)从 byte[]
反序列化到 KieSession
比缓存 KieBase
,每次都生成一个新的 KieSession
并插入那些永久的事实。