2012-03-14 56 views
1

我是一個流口水的新手,在約10天的時間裏學習和工作流口水。 我遇到了一個問題,即Date()對象將在規則的LHS部分中進行比較。在規則的LHS中使用java.util.Date

// in Java 
    SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss"); 
    session.setGlobal("currentDate", format.format(new Date()));  

    # in drl file 
    global java.lang.String currentDate ; 
    #global java.util.Date currentDate; both tested 
    when 
    $united : LotteryUnitedDO(lotteryTypeId == LotteryTypeEnum.SSQ, 
     totalFee >= 1000, 
     shareCnt >= (0.1 * totalShare), 
     #unitedEndTime is a java.util.Date Object 
      unitedEndTime > currentDate  
     ) 

的currentdate的值是當前的日期,我已經看到了一些例子,這樣的文章,但他們使用的日期只有「YYYY-MM-DD」的一部分。但我必須比較「hh:mm:ss」部分。像這樣:

$dateInputBox : DateInputBox(verifyDate > "12-Oct-2005")   

我試圖改變「drools.dateformat」屬性和格式插入到知識庫中的日期只拿到各種彙編error.So我怎樣才能解決這個問題或滴料的只是無法在LHS處理日期的小時部分?

在此先感謝,所有的建議表示讚賞。

+0

我不是滴料都熟悉,但'Date'根據Java API的棄用。你應該使用'日曆'來代替。 – Jon 2012-03-14 03:37:05

+0

好吧,這不是日期造成的麻煩。它修改drools.dateformat屬性時工作。 – Southeast 2012-03-14 07:12:43

+0

我不知道drools如何處理日曆,似乎drools使用Date而不是Calendar。 – Southeast 2012-03-14 07:13:47

回答

9

要比較的日期,你可以簡單地使用Drools的融合的時空運營商(後,前等):

when 
    MyClass(myDate after $someOtherDate) 
then 
    ... 

但是,你們的做法的另一個問題:你應該對全球在沒有理由一個條件。請參閱全局專家手冊section

「now」的概念在Drools中有點問題。其實,也許「問題」不是正確的詞,讓我們一起去「棘手」吧。你如何表達它很大程度上取決於你的用例。我將盡力總結:

  • 如果您在無狀態會話中執行,那麼您的方法將與Fusion運算符結合使用。但是,這仍然不是一個推薦的做法。更好的方法是定義一個事實,稱之爲Now,其中包含一個單獨的Date字段。初始化並將其與您的其他事實一起插入,然後反對它而不是全局。
  • 如果你有一個有狀態的會話,它變得更加棘手,因爲即使會話空閒,實時仍然通過,這意味着你的事實越來越過時。我們解決這個問題的方法是使用WorkingMemoryEventListener。我們使用這個監聽器的objectInsertedobjectRetractedobjectUpdated方法來保持我們Now其實目前(我們不關心精度不到一分鐘,所以我們檢查一分鐘是否已經從上次更新傳遞,以避免不必要的開銷)。規則不會評價,如果工作記憶是不會改變,因此在使用此偵聽足以保證當它需要是Now更新(除非你有依賴的Now當前值的查詢,但那是另一個話題)。
  • 您還可以在STREAM模式下使用Drools Fusion,它具有「現在」的概念,但也強加了一些其他要求。有關更多信息,請參閱Fusion docs
+1

你基本上是正確的mike9322,因爲時鐘應該是事實而不是全局。你可以使用你的「Now」類,或者你可以簡單地使用Drools提供的SessionClock。 PseudoSessionClock修復了你提到的大多數問題。如果您有時間流逝,那麼最好建議您使用STREAM處理模式。 – 2012-03-14 13:53:00

+0

@ mike9322感謝你們兩位的建議,我確信我的代碼中的currentDate是恆定不變的。正如專家手冊中提到的那樣。雖然看起來不是一個好方法,但我認爲它工作正常。我會盡快按照你的建議去嘗試,如果你願意,我的問題會在這裏發佈。非常感謝! – Southeast 2012-03-16 08:07:38

+0

不幸的是不能在我的情況下工作,不知何故它拋出org.drools.RuntimeDroolsException:轉換爲長不支持的類型:類java.util.Date – 2012-10-08 12:04:02