簡體   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