Drools:如何编写在入口点没有数据时会命中的规则

如何解决Drools:如何编写在入口点没有数据时会命中的规则

我是流口水的新手。我希望传感器数据能够从跟踪设备(例如标签设备)发送数据。我正在使用Drools 入口来跟踪传感器数据。我需要基于此传感器数据对某些事件进行警报。

DRL文件如下

import com.sample.AlertRuleModel;

declare AlertRuleModel 
    @role( event )
    @timestamp( timespamp )
end

rule "No signals are coming from any entry-point for more than 10s"
     when
        $f : AlertRuleModel() from entry-point "AlertRuleStream"
        not(AlertRuleModel(this != $f,this after[0s,10s] $f) from entry-point "AlertRuleStream")
    then
        $f.setRuleId(1);
        <Do alert here>
end

rule "Rule on Tag1 has not been in zone1 for more than 1 minutes"
     when
         $f : AlertRuleModel( tagId == 1,zoneId == 1 ) from entry-point "AlertRuleStream"
         not(AlertRuleModel(this != $f,tagId == 1,zoneId != 1,1m] $f) from entry-point "AlertRuleStream")
    then
         $f.setRuleId(2);
        <Do alert here>
end

Java代码

    kSession = RuleExecutionService.getKieSession(packetProcessorData.getAlertRuleDrlPath());
    ruleStream = kSession.getEntryPoint("AlertRuleStream");
    kSession.addEventListener(new DefaultAgendaEventListener() {
        public void afterMatchFired(AfterMatchFiredEvent event) {
            super.afterMatchFired(event);
            onPostExecution(event,RuleTypeEnum.ALERT_RULE.getName());
        }
    });
    
    new Thread() {
        @Override
        public void run() {
            kSession.fireUntilHalt();
        }
    }.start();

流数据插入部分

private BlockingQueue<AlertRuleModel> alertFactQueue;
.
.
AlertRuleModel alertRuleModel = null;
while (true) {
    alertRuleModel = alertFactQueue.poll(1,TimeUnit.SECONDS);
    if (alertRuleModel != null) {
        //LOGGER.debug("Inserting alertRuleModel into \"AlertRuleStream\"");
        ruleStream.insert(alertRuleModel);
        continue;
    } 

    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        LOGGER.error("Exception while sleeping thread during alertFactQueue polling..",e);
    }

}

但是当我运行应用程序时,

  1. 一个规则“在10s内没有任何信号从任何入口点发出”根本没有命中。我不知道为什么,请告诉我我做错了什么还是语法错误是第一个规则。
  2. 在第二条规则“ Tag1不在zone1中超过1分钟”的情况下,当我通过tagId == 1和zoneId == 1传递事实时,它总是立即被击中。我尝试了不同的时间间隔,例如之后[0s,10m] 。但是在传递具有上述值的事实后,它仍然会立即命中。

请告诉我我在哪里犯错误..?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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元字符(。)和普通点?