在规则的LHS中使用java.util.Date

时间:2012-03-14 03:24:22

标签: drools

我是一个流口水的新手,了解和工作大约10天的流口水。 我遇到了一个问题,即要在规则的LHS部分中比较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”属性并将插入知识库的日期格式化以获取各种编译错误。所以如何处理这个或者drools只是无法处理小时部分在LHS中约会?

在此先感谢您的所有建议。

1 个答案:

答案 0 :(得分:9)

要比较日期,您可以简单地使用Drools Fusion的时间运算符(之后,之前等):

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

但是,您的方法还有另一个问题:您不应该在某种情况下对全局进行推理。请参阅全局变量专家手册section

“现在”的概念在Drools中有点问题。实际上,也许“有问题”不是正确的词;让我们选择“棘手”。你如何表示它在很大程度上取决于你的用例。我会试着总结一下:

  • 如果您在无状态会话中执行,那么您的方法将与Fusion运算符结合使用。但是,它仍然不是推荐的做法。更好的方法是定义一个事实,称之为Now,其中包含一个Date字段。初始化并将其与您的其他事实一起插入,然后反对它而不是全局。
  • 如果你有一个有状态的会话,它会变得更加棘手,因为即使会话处于空闲状态,实时也会过去,这意味着你的Now事实越来越过时了。我们解决这个问题的方法是使用WorkingMemoryEventListener。我们使用此侦听器的objectInsertedobjectRetractedobjectUpdated方法来保持我们的Now事实最新(我们不关心精度不到一分钟,因此我们检查是否从上次更新过去一分钟,以避免不必要的开销)。规则不会评估工作内存是否未更改,因此使用此侦听器足以确保在需要时更新Now(除非您的查询依赖于{{1}的当前值},但那是另一个话题。)
  • 您还可以考虑在STREAM模式下使用Drools Fusion,它具有“现在”的概念,但也强加了一些其他要求。有关详细信息,请参阅Fusion docs