我们正在使用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
令人困惑的是...
答案 0 :(得分:-1)
您是否在drools语法中使用了getter方法(getLocation)? 如果是这样,则drools使用方法访问器对字段访问器进行序列化和反序列化
如果您将流口水更改为直接使用位置字段,它应该可以工作