Drools:在Drools事件处理方面遇到问题
我不太会流口水 我正在开发一个应用程序,我的drools引擎每秒都会收到一系列事件。我需要查看过去10秒内的所有事件的属性值是否低于10,如果条件为真,我必须进行一些处理。下面是我尝试的示例代码,请帮助我理解并解决问题 我的规则文件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
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();