Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drools:在Drools事件处理方面遇到问题_Drools - Fatal编程技术网

Drools:在Drools事件处理方面遇到问题

Drools:在Drools事件处理方面遇到问题,drools,Drools,我不太会流口水 我正在开发一个应用程序,我的drools引擎每秒都会收到一系列事件。我需要查看过去10秒内的所有事件的属性值是否低于10,如果条件为真,我必须进行一些处理。下面是我尝试的示例代码,请帮助我理解并解决问题 我的规则文件 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; declare Employee @role (event) @expires(10s

我不太会流口水

我正在开发一个应用程序,我的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

你看过Drools Fusion的文档了吗? 首先,员工听起来并不是一个举办活动的好主意。事件是与您的域相关的事物状态的有意义的变化。因此,事件可以是员工到达办公室的时间,也可以是员工离开办公室的时间,但员工本身是域实体(或规则引擎的事实)而不是事件。 如果您对使用Drools fusion时间操作符感兴趣,我建议您阅读有关滑动窗口(时间窗口)的内容,它可以让您始终看到在最后十秒钟内发生的事情。你不需要用定时器来做这件事。
干杯

您查看Drools Fusion文档了吗? 首先,员工听起来并不是一个举办活动的好主意。事件是与您的域相关的事物状态的有意义的变化。因此,事件可以是员工到达办公室的时间,也可以是员工离开办公室的时间,但员工本身是域实体(或规则引擎的事实)而不是事件。 如果您对使用Drools fusion时间操作符感兴趣,我建议您阅读有关滑动窗口(时间窗口)的内容,它可以让您始终看到在最后十秒钟内发生的事情。你不需要用定时器来做这件事。
干杯

如果你跑了,你忘了告诉我跑的时候发生了什么

如果您的实体集不是很大,我认为这个问题可以通过基本Drools分布很容易地解决

我有一个类似于您的应用程序,适用于我:

rule "Clear only auxiliar fact"
  salience 1
  when
    af: AuxFact()
  then
    DroolsRepository.retractFact(af);
end

rule "Clear auxiliar fact and an old meaningful fact"
  salience 1000
  when 
    af: AuxFact()
    mf: MeaningfulFact()
  then
    if(DroolsRepository.getCurrentTimeMillis() - tmf.getCreationDate().getTime() > 5000){
      DroolsRepository.retractFact(af);
      DroolsRepository.retractFact(mf);
      // YOUR MEANINGFUL CODE
    }
    else{
      DroolsRepository.retractFact(af);}
end

query "getAllFacts"
  $result: Fact()
end


类似的方法可能更简单、更有效。

如果运行了,您会忘记告诉它发生了什么

如果您的实体集不是很大,我认为这个问题可以通过基本Drools分布很容易地解决

我有一个类似于您的应用程序,适用于我:

rule "Clear only auxiliar fact"
  salience 1
  when
    af: AuxFact()
  then
    DroolsRepository.retractFact(af);
end

rule "Clear auxiliar fact and an old meaningful fact"
  salience 1000
  when 
    af: AuxFact()
    mf: MeaningfulFact()
  then
    if(DroolsRepository.getCurrentTimeMillis() - tmf.getCreationDate().getTime() > 5000){
      DroolsRepository.retractFact(af);
      DroolsRepository.retractFact(mf);
      // YOUR MEANINGFUL CODE
    }
    else{
      DroolsRepository.retractFact(af);}
end

query "getAllFacts"
  $result: Fact()
end

类似的方法可能更简单、更有效

// Boot rules re-executing thread.
new Thread(new Runnable(){
  public void run(){
  do{
    kSession.insert(new AuxFact());
    try{
      Thread.sleep(99);}
    catch(InterruptedException e){
      e.printStackTrace();}}
  while(true);}
}).start();