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

drools:drools事件处理遇到问题

谭建章
2023-03-14

我对口水很陌生。

我正在开发一个应用程序,其中我的drools引擎每秒钟将获得一系列事件。我需要查看过去10秒内所有事件的属性值是否低于10,如果条件为真,我必须进行一些处理。这里是我尝试的示例代码,请帮助我理解和解决问题。

我的规则文件....

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


declare Employee 
@role (event)
@expires(10s)
end

// Using timer to ensure rule processing starts only after 10 secs, 
//else processing starts as soon as first event comes in
rule "Test Timer"
no-loop true
10timer(int: 5s)
when
$E : Employee()
$total : Number( doubleValue < 1 ) 
    from accumulate( Employee( Age > 10 ), count() )
then 
   System.out.println(  $E.getName() + " is crossing the threshold of 20");
retract($E);
end

和主类

// import classes removed from here...
public class MainClass {

/**
 * @param args
 */
public static void main(String[] args){

    //Create KnowledgeBase...
    KnowledgeBase knowledgeBase = createKnowledgeBase();

    //Create a stateful session
    StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
//  KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newConsoleLogger(session);
    try {

        // Using random generator to simulate the data.
        int randomInt=0;
        Random randomGenerator = new Random();
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = null; 

        while (true) {
            Thread.sleep(1000);
            date = new Date();
            randomInt = randomGenerator.nextInt(12);

            //Create Facts and insert them      
            Employee emp = new Employee();
            emp.setName("Anurag" + randomInt);
            emp.setAge(randomInt);

            //LOAD THE FACT AND FIREEEEEEEEEEEEEEEEEEE............
            System.out.println(dateFormat.format(date)+ " => Random no " + randomInt);
            session.insert(emp);
            session.fireAllRules();
        } 

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        session.dispose();
    }
}

    /**
    * Create new knowledge base
    */
private static KnowledgeBase createKnowledgeBase() {
    KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            //Add drl file into builder
    File drl = new File("D:\\eclipse\\worspace\\Research\\misc\\testforall.drl");
    builder.add(ResourceFactory.newFileResource(drl), ResourceType.DRL);
    if (builder.hasErrors()) {
        System.out.println(builder.getErrors().toString());
        //throw new RuntimeException(builder.getErrors().toString());
    }

    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
            //Add to Knowledge Base packages from the builder which are actually the rules from the drl file.
    knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
    KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

    config.setOption( EventProcessingOption.STREAM );
    return knowledgeBase;
}
}

public class Employee {
private String Name;
private int Age;
// getter - setters
}

共有1个答案

巫懿轩
2023-03-14

你查过Drools融合文档了吗?首先,Employee听起来不是一个好主意。事件是与您的域相关的某物的状态的有意义的变化。因此,事件可以是员工到达办公室的时间,也可以是员工离开办公室的时间,但是员工本身是一个域实体(或者对于规则引擎来说是一个事实),而不是一个事件。如果您对使用Drools fusion临时操作符感兴趣,我建议您阅读关于滑动窗口(临时窗口)的内容,它可以让您随时看到过去十秒钟发生了什么。你不需要使用计时器。干杯

 类似资料:
  • 我正在写一个新的家长pom.xml 下面是我的孩子pom 下面是我在构建过程中遇到的错误

  • 我创建并尝试使用构建项目,但它不工作。不是这个项目,我试着构建我的所有项目,但在我的ubuntu笔记本电脑上不工作 [信息]扫描项目...从中心下载:https://repo . maven . Apache . org/maven 2/org/spring framework/boot/spring-boot-starter-parent/2 . 6 . 11/spring-boot-start

  • 本文向大家介绍体验MySQL5.6.25并处理所遇到的问题,包括了体验MySQL5.6.25并处理所遇到的问题的使用技巧和注意事项,需要的朋友参考一下 在安装包下的根目录,之前的版本是有my.ini文件可以用来配置的,然而在新的版本中却只发现了my-defult.ini文件。 而且里面的数据少之又少。想要修改字符编码之前的方式行不通了。 用记事本打开该文件会发现并没有【default-charac

  • 我正在尝试从何处运行此源代码https://github.com/kishancs2020/TicketBookingServiceJunitTestingGithub在我的Jenkins中查看了在Jenkins文件中创建的管道源代码。 我已经更新了maven,java版本来修复它,但错误仍然是一样的。我也通过了这个链接http://cwiki.apache.org/confluence/disp

  • 本文向大家介绍使用批处理删除文件夹时遇到的问题,包括了使用批处理删除文件夹时遇到的问题的使用技巧和注意事项,需要的朋友参考一下 C盘有一个文件夹1,里面有2.exe和3.exe 。 想做一个批处理,先运行1.exe,安装完成后运行2.exe  等到2.exe安装完成后,删除文件夹1 我的代码如下 现在有一个缺点。2和3安装完成后,文件夹1不能被删除,里面2.exe被删除,3.exe仍然存在。不知道

  • 我们需要在constructor中对于事件与对应的handler函数进行绑定. 大多数时候我们在发出DOM事件的组件内部写我们的handler函数. 在下面的例子中,我们在组件内部创建了一个click handler, 因为我们想所有的Swithcer Component当被点击时,做出同样的响应. class Switcher extends React.Component { render