Drools 中@duration 和@expires 的区别

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?