如何解决Drools 中@duration 和@expires 的区别
我不完全理解 Drools 中事件的 ./TestInternal.sh: line 16: where: command not found
和 @duration
元数据标签之间的区别。有人可以澄清一下吗?
解决方法
事件的持续时间是事件持续的时间。它的到期是当它从工作内存中删除时。
想到这一点的最简单方法是将它们与现实世界的概念联系起来。现实世界的“事件”(例如,会议)有一定的持续时间(例如 1 小时)。它的到期时间是它“脱离”您的日历的时间。如果您正在对日历进行建模,那么会议活动的到期将是我们不再关心它的时刻,可能是在一天或工作周过去之后。
这种区别的原因是因为 temporal operators 允许我们根据同时发生的事件编写条件规则。由于事件不是即时的(例如,当您不使用时间点事件时,它们具有持续时间)它们可以以多种方式重叠。一旦事件过期,它就会从工作内存中删除,后续的事件和规则执行将不再考虑该过期事件。
这是一个例子。假设我们正在构建一个应用程序,用户可以尝试 3 次输入密码。每次尝试失败后,有 3 分钟的冷却时间,然后他们才可以再次尝试。如果用户在 30 分钟内尝试登录失败 3 次,他们将被锁定; 30 分钟结束后,我们就不再关心该事件,可以将其丢弃。
对于此用例,我们将事件命名为 AccessDisallowed
。它的持续时间为 3 分钟,因为这是它“活动”的时间量。它的有效期为 30 分钟,因为锁定仅在 30 分钟的窗口内触发。
declare AccessDisallowed
@duration( cooldownTime ) // property holding the duration,3 minutes
@expires( 30m )
end
然后我们可以编写利用这些事件的持续时间和到期时间的规则。在这些示例规则中,我只是要打印消息;在实际系统中,副作用可能包括警告安全系统,或锁定数据库中的用户记录。
rule "Disallow access for 3 minutes after Access Disabled"
when
$lockoutPd: AccessDisallowed()
PasscodeEntry( this during $lockoutPd )
then
System.out.println("Passcode entry detected during lockout period.");
end
rule "Lock account after 3 Access Disables"
when
List( size >= 3 ) from accumulate( $a: AccessDisallowed(),collectList($a) )
then
System.out.println("3+ login attempts within 30m detected");
end
第一条规则很简单。当收到 PasscodeEntry
事件时,我们会检查当前是否存在 AccessDisallowed 事件。如果有,我们会做出相应的回应。这利用了持续时间。
第二条规则利用了到期。如果在 30 分钟的窗口内有 3 次登录尝试,我们将锁定帐户。在这种情况下,我们利用 30 分钟后 AccessDisallowed 事件过期并从工作内存中删除这一事实;因此,如果在工作内存中存在 3 个 AccessDisallowed 事件,那么它们在过去 30 分钟内都被放置在那里是理所当然的。
(在实际应用程序中,我们可能会使用滑动窗口或带有累加器的时间 after
运算符来检测最后一个条件,因为我们可能需要对所讨论的实际事件做其他工作。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。