Esper规则语言:使用计时器定时器

时间:2016-04-20 13:48:02

标签: java rule-engine complex-event-processing esper

我想在Esper中编写一条规则,当最后15分钟内步数为0并且心率超过120时触发。我已经提出以下规则:

EPStatement cepStatementRule8 = cepRule.createEPL("context PartitionByMacSteps select * from "
                + "Steps.win:time(15 min) S, HeartRate.win:time(1 min) H "
                + "having (max(S.steps)-min(S.steps) = 0) and (H.heartrate > 120)");
        cepStatementRule8.addListener(new rule8Listener());

我的HeartRate类包含以下字段:

int heartrate;
String heartratesTimestamp;
String macAddress;

我的Steps类有以下字段:

int steps;
String stepsTimestamp;
String macAddress;

我面临的问题是,如果在最后15分钟内没有采取任何措施,我只希望触发规则。现在,当两个步骤事件具有相同数量的步骤时,它将触发。我知道我可能不得不使用timer.interval但我无法弄清楚如何编写这个规则。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

要求定义不明确。什么"心率超过120"意思是,它只是一次或15分钟或1分钟,另外心率如何超过120"重叠或与步骤条件重合。

我建议将问题分解为两个独立的状态检测,然后是一个联接来检测两个条件是否在某个时间发生。这也使测试变得容易,因为您可以看到每个条件都单独指出。例如,大致相同的东西:

// detect the steps condition
insert into StepConditionDetected 
select *, current_timestamp as detectedTime select * from pattern[...];

// detect the heartrate condition
insert into HeartrateConditionDetected 
select *, current_timestamp as detectedTime from pattern[...];

// join step and heartrate condition to see if they co-occur in some way
select * from StepConditionDetected.std:unique(macAddress).win:time(15 min) as a,
HeartrateConditionDetected.std:unique(macAddress).win:time(15 min) as b
where a.macAddress = b.macAddress

你可以添加到where子句加入这两个条件并使用" overlap"实现一些艾伦间隔代数,即"和a.detecttime.overlaps(b.detectedTime,x,y)"