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

Sou*_*ast 1 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     
        )
Run Code Online (Sandbox Code Playgroud)

currentDate的值是当前日期,我看过一些例子和文章这样做,但他们只使用了日期的"yyyy-mm-dd"部分.但我必须比较"hh:mm:ss"部分.像这样:

    $dateInputBox : DateInputBox(verifyDate > "12-Oct-2005")        
Run Code Online (Sandbox Code Playgroud)

我试图更改"drools.dateformat"属性并格式化插入知识库的日期只是为了获得各种编译错误.所以如何处理这个或者drools只是无法处理LHS中日期的小时部分?

在此先感谢您的所有建议表示赞赏.

小智 9

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

when
  MyClass( myDate after $someOtherDate )
then
  ...
Run Code Online (Sandbox Code Playgroud)

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

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

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