2012-03-14 27 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