ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – Drools:获取最近的3个事件

2019-06-26 01:48:11  阅读:280  来源: 互联网

标签:java drools


我正在开发一个小型Drools项目,因为我想了解更多关于使用规则引擎的信息.我有一个名为Event的类,它包含以下字段:

>字符串标签;一个标签,可以是任何字符串.
>长毫米;时间戳. (实际上,这是从JodaTime LocalDate字段转换而来的,该字段也在Event中.)
> int值;我想要的价值.

我在我的知识库中插入了数百个Event实例,现在我想获得标记为“OK”的3个最新事件.我想出了以下代码:

rule "Three most recent events tagged with 'OK'"
when
    $e1 : Event( tag == "OK",
                 $millis1 : millis )
    $e2 : Event( tag == "OK",
                 millis < $millis1, $millis2 : millis )
    $e3 : Event( tag == "OK",
                 millis < $millis2, $millis3 : millis )

    not Event( tag == "OK",
               millis > $millis1 )
    not Event( tag == "OK",
               millis > $millis2 && millis < $millis1 )
    not Event( tag == "OK",
               millis > $millis3 && millis < $millis2 )
then
  # Do something with $e1.value, $e2.value and $e3.value
end

但我觉得应该有更好的方法来做到这一点.这非常冗长,不容易重复使用:如果我想获得值为>的五个最新事件,该怎么办? 10,例如?我最终会复制粘贴很多代码,我不想这样做:).
此外,代码对我来说看起来不是很“漂亮”.我不喜欢重复的不是Event …约束,我也不喜欢不得不一遍又一遍地重复相同的标签条件. (这个例子是我的真实应用程序的一个大大简化的版本,其中条件实际上要复杂得多.)

我该如何改进这段代码?

解决方法:

假设您正在使用STREAM事件处理模式,并且您的事件在流中排序:

rule "3 most recent events"
when
    accumulate( $e : Event( tag == "OK" ) over window:length(3),
                $events : collectList( $e ) )
then
    // $events is a list that contains your 3 most recent 
    // events by insertion order
end

=====编辑====

根据你的评论,这里是如何在Drools 5.4中实现你想要的:

declare window LastEvents
    Event() over window:length(3)
end

rule "OK events among the last 3 events"
when
    accumulate( $e : Event( tag == "OK" ) from window LastEvents,
                $events : collectList( $e ) )
then
    // $events is a list that contains the OK events among the last 3 
    // events by insertion order
end

只要仔细检查语法,因为我正在做这个,但它应该接近这一点.

标签:java,drools
来源: https://codeday.me/bug/20190626/1288933.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有