2012-05-23 17 views
2

我想寫一個積累功能,需要知道當前時間。 我明顯可以使用System.currentTimeMillis(),但是爲了測試即時通訊和僞時鐘運行drools會話,並希望能夠測試這個函數。訪問流水線會話時鐘從累加功能或規則代碼

即時通訊尋找一種獲得會話時鐘(或更好的是,KnowledgeRuntime)的方法,無論是從getResult()方法,還是如果不可能,從drools代碼本身(在部分時)我可以將時鐘傳遞給函數

回答

4

使用時鐘時要小心,因爲您可能會有不少驚喜。請注意,當將事實/事件插入會話或使用更新/修改調用進行修改時,將評估約束條件。這意味着約束被評估時的時間可能與規則被觸發時的時間不同。這就是爲什麼Drools不會將當前時間直接暴露給LHS模式的原因。

話雖如此,要做到這一點的方法是插入會話時鐘作爲事實到會話中,並將其綁定任何其他事實:

rule X 
when 
    $clock : SessionClock() 
    ... your patterns/accumulate/etc ... 
then 
    ... 
end 
+0

ok,但SessionClock即時插入不會是一個靜態副本 - 它將是一個活的對象引用,對吧?這意味着從它得到時間會給我「正確的」時間(功能評估的會話時間,而不是事件插入)。 ,並且,鑑於我的會話是持久化和序列化的 - 會話時鐘是否可以快速序列化?如果沒有,我如何設置它,以便我可以避免序列化並在會話激活時重新提供它? – radai

+0

如果您插入會話時鐘作爲事實,則每次提前時鐘時,都需要調用update()來通知引擎。也許你可以與時鐘分享你想要做的事情,也就是說,爲什麼你的累積功能需要它,並且我們可以以這種方式更好地幫助你。 –

+0

這個想法是這樣的 - 可以說我有一個硬盤驅動器(C :),我每天都會抽樣。每個樣本只有兩塊數據 - 空閒空間和時間戳。如果我的硬盤即將在一週內填滿,我希望有規則可以解僱。爲此,我需要編寫一個累積函數,對最新的N個樣本(長度窗口)執行線性迴歸,繪製趨勢線,計算趨勢線何時達到0(==自由空間不足)並檢查此時間點比「now」少一週。這個「現在」參考是我需要時鐘的地方。 – radai

1

在單元測試中,我發現,添加$clock : SessionClock()when會導致單元測試不觸發,FWR(可能是因爲我嘲笑它爲SessionPseudoClock,因此在工作記憶中沒有SessionClock事實)。

我能夠然而獲得會話時鐘(僞或實數),而無需一個條件綁定,通過使用droolsKnowledgeHelper實例:

例如

then 
    System.out.println(String.format(
     "It is now %s", 
     new java.util.Date(drools.getWorkingMemory() 
            .getSessionClock() 
            .getCurrentTime()) 
     .toString()));