2014-06-09 109 views
0

我正在開發一個爲促銷引擎系統運行Drools 5.5的項目。我在構建知識庫時嘗試瞭解編譯步驟時遇到了一些麻煩。這個drl應該編譯嗎?

這是這種情況:我有一個drl在條件大小> = int的列表上執行收集(LHS)。 生成drl的系統,做錯了,現在我有運行時異常。現在,我正試圖理解這種情況下編譯如何在drools上運行。

的事情是,在此收集,約束(大小> =的事情,這東西不是整數)不被Drools的5.5編譯器驗證,異常只會在運行時發生爆炸:

$COLLECT_ALL : ArrayList (size >= something) 
    from collect (Product (...)) 

但是,在drools 5.0.0上驗證了相同的代碼,並且我可以在創建知識庫之前刪除此規則。

我不知道這是一個錯誤還是隻是錯誤理解LHS上的流口水。

無論如何,這是我的工作

KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
builder.add(ResourceFactory.newByteArrayResource(rule.getBytes()) , ResourceType.DRL); 
if (builder.hasErrors()) { 
    createErrorMessage(builder); 
} 

回答

0

驗證步驟的DRL解析器undergon 5.0.0經過長期的一系列的改進,然後之間存在着一個完整的重新設計(IIRC )5.2和5.3。

爲了理解編譯時和運行時在5.5中的ArrayList(size >= something)會發生什麼,我們必須知道「東西」是什麼。對一切代替「某事」的完整討論超出了範圍,但是,作爲一個經驗法則,如果表達式是有效的Java,它應該在運行時進行編譯而不是發牢騷,隆隆或顛簸 - 更不用說「爆炸」了(讓我們希望它不會損壞核心)。

後來

的原因是(沿線發展的某處)區分已經作出,而不是而所有其他類「類型安全」應用「類型安全」到集合默認情況下,該意味着編譯時檢查。

您可以通過添加這對您的DRL文件上使用打開此,例如,對於ArrayList

declare ArrayList 
@typesafe(true) 
end 
+0

從技術上講,它不是一個有效的Java語句。 「某事」確實是某種東西。我知道這聽起來很奇怪,但它只是文件中的一個詞。看起來像一個變量,但從未宣佈。例如:當COLLECT_ALL:ArrayList(size> = tag-xyz) from collect(Product(...))時,規則「XYZ」然後...' – VitorBtf

+0

感謝您的澄清。 - 看起來和w.r.t有區別錯誤報告。 'Product'中的類似錯誤在編譯時被標記。我在Drools用戶名單上追求這一點。 – laune

+0

請參閱我的答案的補充內容。 – laune