当前位置: 首页 > 知识库问答 >
问题:

在一段时间内没有遵守规则

侯善
2023-03-14

我是Drools的新手。我需要用Spring启动构建一个应用程序

我正在使用一个“geofence\u rule.drl”文件来保存与地理位置相关的规则。

rule "Rule for Tag position in room 1"
when
    model : ComponentModel(positionValue <= 50)
then
    model.setRoomId(1);
end

rule "Rule for Tag position in room 2"
when
    model : ComponentModel(positionValue > 50)))
then
    model.setRoomId(2);
end

模型等级如下所示。

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ComponentModel{

    private long tagId;
    private long roomId;
    private int positionValue;

}

我可能会得到“n”个标签的位置相关数据,比如tag1、tag2、tag3等等。我需要计算tag1在过去5分钟内是否不在房间1中(这意味着tag-1的数据没有达到“房间1中tag位置的规则”)。Drools中是否支持这种计算?

我在drools留档中看到了“not”关键字。但它只是否定了规则的条件。我需要在最后几分钟检查规则的攻击性质,这个时间限制在应用程序中是可配置的。

共有1个答案

董联
2023-03-14

您正在寻找流模式和负面模式。这些链接指向Drools官方文档。

流模式是Drools中的两种事件模式之一。默认是“云”模式,您可以预先获得所有事实并自动做出决策。另一种模式“流”模式用于处理时间流,这听起来很像您的“ping”应用程序。在流模式下,Drools会在每个事实进入时评估它,并知道时间——即其他事实进入的时间。

流模式中的负模式是not关键字的逻辑时间扩展。正如您正确指出的,在云模式下,它只是否定一个条件(例如,“工作内存中没有符合此条件的条件。”)但是,在流模式下,您可以更新这些模式以在一段时间内生效。

Drools文档提供了以下示例:

rule "Sound the alarm"
when
  $h: Heartbeat() from entry-point "MonitoringStream"
  not(Heartbeat(this != $h, this after[0s,10s] $h) from entry-point "MonitoringStream")
then
  // Sound the alarm.
end

“when”子句中的第一行标识心跳的实例($h)。第二个标识在10秒内未接收到心跳的情况。如果这两个条件都为true,则执行该规则,在这种情况下会触发警报。

这和你的规则是一样的。

rule "Tag has not been in Room 1 for 5 minutes"
when
  // Tag with ID 1, present in Room 1 -- First instance
  $tag: ComponentModel( tagId == 1, roomId == 1 ) from entry-point "TrackingStream"

  // Trigger if this condition hasn't been met a second time within 5 minutes
  not( ComponentModel( 
    this != $tag, 
    tagId == 1,
    roomId == 1,
    this after[0s, 5m] $tag ) from entry-point "TrackingStream")
then
  // Do whatever it is you need to do for this condition
end

在本例中,我利用了after临时操作符(链接到Drools文档)

基本上就是这样--

$tag: ComponentModel( tagId == 1, roomId == 1 ) from entry-point "TrackingStream"

第一个条件标识场景,在这种情况下,ID 1存在于房间1中。它标识我们正在跟踪的该情况的当前实例。由于这是一个时间流,很容易将其视为“标记实体(1)刚刚进入房间1”。

not( ComponentModel( 
  this != $tag, 
  tagId == 1,
  roomId == 1,
  this after[0s, 5m] $tag 
) from entry-point "TrackingStream")

这就是魔法发生的地方,语法需要一点时间才能习惯。第二个条件是等待下一个时态,然后检查条件。检查的条件包括:

  • TagID为1,

时间约束(this after[0s,5m]$标记)表示等待检查此条件。如果在此时间范围内,在$标记之后收到第二个ComponentModel,则规则将不会跳闸,场景将重复等待长达5分钟。由于时间范围立即开始检查,我们需要在not(…)中明确地从匹配中排除$tag子句(此!=$标记

举例来说,这就是它的执行方式(简化):

  • 0m:00s-收到事件A(id=1,房间=1)$标记=事件A。我们开始检查传入流的第二个条件
  • 0米:30秒-收到事件B(id=2,房间=1)。ID不匹配;已忽略
  • 0m:45s-收到事件C(id=1,房间=1)。事件A规则匹配“已取消”。现在检查是否有$标记=事件C。
  • 5m:45s-在5分钟窗口内未收到匹配的事件,事件C的规则触发右侧
 类似资料:
  • 本文向大家介绍在使用HTML5时有哪些规则需要遵守?相关面试题,主要包含被问及在使用HTML5时有哪些规则需要遵守?时的应答技巧和注意事项,需要的朋友参考一下 使用HTML5需要遵守哪些规则? 新的特性应该基于HTML、CSS、DOM和JavaScript 减少对外部插件的需求(如Flash) 更好的错误处理 更多的替换脚本的标记 HTML5应与设备无关 开发过程必须可视化

  • 问题内容: 在管道级别,我指定代理和节点(带有标签和自定义工作区)。管道启动时,它将在指定的节点上运行,但是当命中“ build job”时,将选择第一个可用节点。我尝试使用NodeLabel插件,但是那也不起作用。 这是我的: 问题答案: 当您使用Jenkinsfile中的指令时,它告诉Jenkins您想要构建一个完全独立的作业。正是 其他工作 需要指定将要构建的代理。如果这是基于Jenkins

  • 作为一个相对的Java新手,我很困惑地发现了以下几点: 点. java: Edge.java: 主代码段:私有集blockedEdges 为什么这令人惊讶?因为在我将其编码为依赖平等之前,我检查了留档,它说: 如果该集合包含指定的元素,则返回true。更正式地说,当且仅当这个集合包含元素e,使得(o==null?e==null : o.equals(e)) 这句话非常清楚,它指出只需要相等。f.e

  • 本文向大家介绍使用HTML5需要遵守哪些规则?相关面试题,主要包含被问及使用HTML5需要遵守哪些规则?时的应答技巧和注意事项,需要的朋友参考一下 * 新的特性应该基于HTML、CSS、DOM和JavaScript * 减少对外部插件的需求(如Flash) * 更好的错误处理 * 更多的替换脚本的标记 * HTML5应与设备无关 * 开发过程必须可视化

  • 问题内容: 结果如下: 2011-09-24 14:10:51 -0400 2011年9月24日星期六20:10:51 为什么当我解析来自format()的日期时,它不遵守时区? 问题答案: 您正在打印调用的结果,该调用 始终 使用默认时区。基本上,除了调试之外,您不应该使用其他任何东西。 不要忘记,一个不 具有 时区-它代表着一个时刻,因为自Unix纪元(午夜1970年1月1日UTC)毫秒。 如

  • 我在我的项目中使用了Spring Boot,Spring Data,JPA(Hibernate)和MySQL。这是我的存储库界面中的方法签名: 当我检查SQL日志时,我可以看到“for共享”子句被附加到选择语句中。 这是MySQL文档中关于共享锁的一段引文: 如果这些行中的任何一行被尚未提交的另一个事务更改,您的查询将等待该事务结束,然后使用最新值。 我实际上可以通过从另一个线程更新该书来触发阻塞