Java Drools:无法反序列化知识库

Java Drools:无法反序列化知识库,java,drools,Java,Drools,我们正在使用Drools 7.5.0和Java8 我们有一个处理传感器事件的服务器应用程序,大约有1200个会话。每个会话都是一个参数化的知识。当我们重新启动服务器时,我们必须恢复所有会话,这并不像我们希望看到的那样快。因此,请尝试通过从数据库加载序列化的知识库来优化恢复过程 我们使用以下代码对知识库进行序列化和反序列化: public static byte[] serializeKieBase(KieBase kieBase) throws IOException { ByteArr

我们正在使用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
它被抛出到这行代码中:

令人困惑的是

  • 在我们的规则中,我们确实使用了一个左右的setter,除了这个问题,它们工作得很好
  • 我们编写了测试来检查事件是否可序列化和反序列化,并且工作正常
  • 当我们为这个字段添加setter时,它工作得很好,但我们不明白为什么

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

    如果将drools更改为直接使用“位置”字段,它应该可以工作