繁体   English   中英

流口水:无法反序列化知识库

[英]Drools: Cannot deserialize knowledge base

我们正在使用Drools 7.5.0和Java8。

我们有一个处理传感器事件的服务器应用程序,大约有1200个会话。 每个会话都作为参数化知识。 当我们重新启动服务器时,我们必须恢复所有会话,但速度不如我们希望的那样快。 因此,尝试通过从数据库加载序列化的知识库来优化恢复过程。

我们使用以下代码对知识库进行序列化和反序列化:

public static byte[] serializeKieBase(KieBase kieBase) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new DroolsObjectOutputStream(baos);
    oos.writeObject(kieBase);
    oos.close();

    return baos.toByteArray();
}

public static KieBase deserializeKieBase(byte[] serializedBase) throws IOException, ClassNotFoundException {
    ByteArrayInputStream is = new ByteArrayInputStream(serializedBase);
    ObjectInputStream ois = new DroolsObjectInputStream(is);

    return (KieBase) ois.readObject();
}

事件是不可变的,具有最终字段。 当我们还原会话时,我们得到以下异常:

java.lang.RuntimeException: Unknown extractor for com.easierlife.rs.model.Measurement-location

它被抛出以下代码行: https : //github.com/kiegroup/drools/blob/master/drools-core/src/main/java/org/drools/core/common/DroolsObjectInputStream.java#L150

令人困惑的是...

  1. 我们确实在规则中使用了setter左右,但除此问题外,它们工作正常。
  2. 我们已经编写了测试,以检查事件是否可序列化和反序列化,并且工作正常。
  3. 当我们为该字段添加设置器时,它可以正常工作,但我们不明白为什么。

您是否在drools语法中使用了getter方法(getLocation)? 如果是这样,则Drools使用方法访问器对字段访问器进行序列化和反序列化

如果您将流口水更改为直接使用位置字段,它应该可以工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM