gpt4 book ai didi

operator-keyword - Apama "within"和 "and"运算符不执行监听器?

转载 作者:行者123 更新时间:2023-12-04 08:35:46 26 4
gpt4 key购买 nike

我想建立一个简单的监视器。谁在时间窗口中监听事件并执行监听器。但是监听器没有被执行。我有一种感觉,Apama 引擎不支持。

从文档:
临时操作是 CEP 的常见要求。例如,我们可能想对我们的表达式设置时间限制。 inside 运算符指定表达式必须完成的时间(以秒为单位),从第一次激活组成模板时开始。当我们在 15.0 秒内接收到带有适当字段的 MyEvent 和 MyOtherEvent 时,以下表达式是完整的。澄清一下,在这个表达式中,计时器在 MyEvent 或 MyOtherEvent 匹配时启动:

on all MyEvent(id="important") and MyOtherEvent(id="important") within 15.0
//Eventdefinition
&FLUSHING(1)
&SETTIME("2019-04-03T14:07:00.0+01:00")

&TIME("2019-04-03T14:07:01.0+01:00") // sec 1
TestEvent("START","1")

&TIME("2019-04-03T14:07:02.0+01:00") // sec 2
TestEvent("BODY_ID","1")

&TIME("2019-04-03T14:07:03.0+01:00") // sec 3
TestEvent("BODY_TYPE","1")

&TIME("2019-04-03T14:07:20.0+01:00") // sec 4
TestEvent("BODY_MODELL","1")

//EPL monitor Rule
on all TestEvent(tag= "BODY_ID") as test
and TestEvent(tag = "START") as test1 within(5.0)
{
log "test" + test.tag at INFO; //never called!
}

- - -编辑 - - -

另一种解决方案是这个,但不漂亮!而且您无法访问事件的详细信息。
on all (
TestEvent(tag = "START") as e1
or TestEvent(tag= "BODY_ID") as e2
or TestEvent(tag= "BODY_TYPE") as e3
or TestEvent(tag= "BODY_MODELL") as e4
) -> (//followd by random tag
TestEvent(tag = "START")
or TestEvent(tag = "BODY_ID")
or TestEvent(tag = "BODY_TYPE")
or TestEvent(tag = "BODY_MODELL")
) within(3.0) -> (//followd by random tag
TestEvent(tag = "START")
or TestEvent(tag = "BODY_ID")
or TestEvent(tag = "BODY_TYPE")
or TestEvent(tag = "BODY_MODELL")
) within(3.0) -> (//followd by random tag
TestEvent(tag = "START")
or TestEvent(tag = "BODY_ID")
or TestEvent(tag = "BODY_TYPE")
or TestEvent(tag = "BODY_MODELL")
) within(3.0) {
//Problem: No e1, e2,e3,e4 are not accessible...
}

最佳答案

为什么监听器不触发

引用:http://www.apamacommunity.com/documents/10.3.0.2/apama_10.3.0.2_webhelp/apama-webhelp/index.html#page/apama-webhelp%2Fta-DevApaAppInEpl_listening_for_event_patterns_within_a_set_time.html%23

When you run the code an event listener is created that attempts to match the sequence of events based on the operators you choose. So


on A() within(10.0) listenerAction();

After the correlator sets up this event listener, the event listener must detect an A event within 10 seconds. If no A event is detected within 10 seconds, the event expression becomes permanently false and the correlator subsequently terminates the event listener.



根据您的表达,“内部”本质上的行为与上述相同。
on all TestEvent(tag= "BODY_ID") as test
and TestEvent(tag = "START") as test1 within(5.0)
{
log "test" + test.tag at INFO; //never called!
}
and如果任一操作数的计算结果为 false,则运算符将为 false。这会触发删除事件监听器。

在这种情况下, within如果超时到期而未收到事件,则为 false。 within实际上是引用事件监听器的创建,因为 and没有顺序或时间的概念。这意味着评估返回 permanently falseall不会重新创建事件模板,因为它永远不会为真, and 也不会。 .

如果您尝试使用方括号强制将 'within' 应用于第二个事件,则仅适用相同的结果(超时仍然来自监听器创建)。

如果删除 within并忽略计时然后 and如您所料,任何一个订单都会触发事件正文。但是,如果您有一系列事件,例如:

A

B

A



由于事件监听器的行为方式,您将触发主体两次,A+B 和 B+A。

解决方案

实现您想要的最简单方法是使用“跟随”运算符和内。因为您想以任一顺序接收事件,我们需要使用 or运算符并用 within 指定两者.
on all ( ( TestEvent(tag= "BODY_ID") as test
-> TestEvent(tag = "START") as test1 within(5.0))
or
( TestEvent(tag= "START") as test
-> TestEvent(tag = "BODY_ID") as test1 within(5.0)) )
{
log "test" + test.tag at INFO; //never called!
}

当您创建事件监听器时,它不会在“->”的右侧评估(启动计时器),直到收到 START 或 BODY_ID。如果在计时器到期之前没有事件进入,则监听器将像以前一样终止,但它现在不是永久错误,因此“全部”重新创建事件监听器并等待第一个事件到达。

请参阅此了解更多详细信息: listening for event patterns within a set time

替代

另一种方法是使用我下面提到的流。

我已经研究了一下,这很有效,但我不完全确定这是否是您所需要的。可能有更好的方法来设置流,以便它们执行您需要的操作
    from t1 in all TestEvent () select t1.tag as tag1 
from t2 in all TestEvent ()
within (5.0) select t2.tag as tag2 {
if( ( tag1 = "BODY_ID" and tag2 = "START" ) or
( tag1 = "START" and tag2 = "BODY_ID" ) ) {
log "t1 " + tag1 + " t2 " + tag2 at INFO;
}
}

在文档中查看此处的部分: Stream network

关于operator-keyword - Apama "within"和 "and"运算符不执行监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55511318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com