2

我正在尝试定义一个监视器,在该监视器中接收事件,然后在多个上下文中处理它们(如果我理解正确,大致等同于线程)我知道我可以写

spawn myAction() to myNewContext; 

这将在新的上下文中运行该操作。

但是,我想要一个动作,当它进入我的监视器时,它会响应一个事件:

on all trigger() as t {
  doMyThing()
}

on all otherTrigger() as ot {
  doMyOtherThing()
}

我可以on all以使用特定上下文的方式定义 my 吗?就像是

on all trigger() as t in myContext {
  doMyThing()
}

on all otherTrigger() as t in myOtherContext {
  doMyOtherThing()
}

如果不是,在 Apama EPL 中定义它的最佳方法是什么?当它们到达时,我是否可以有多个上下文处理相同的事件,循环方式?

4

2 回答 2

4

来自外部接收者(即外部世界)的 Apama 事件仅传递到public上下文,包括“主”上下文。因此,根据您的架构,您可以将您的操作生成到公共上下文中

// set the receivesInput parameter to true to make this context public
spawn myAction() to context("myContext", true);

...

action myAction() {
    on all trigger() as t {
        doMyThing();
    }
}

或者,将您的操作生成到私有上下文并在公共上下文中设置事件转发器,通常是主上下文(将始终存在)

spawn myAction() to context("myNewContext");
on all trigger() as t {
    send t to "myChannel"; // forward all trigger events to the "myChannel" channel
}

...

action myAction() {
    monitor.subscribe("myChannel"); // receive all events delivered to the "myChannel" channel
    on all trigger() as t {
        doMyThing();
    }
}

生成到私有上下文并利用通道系统通常是更好的设计,因为它只将事件发送到关心它们的上下文

于 2018-09-28T09:49:15.513 回答
4

为了扩展 Madden 的答案(我还没有足够的代表发表评论),私有上下文和转发器也是实现真正循环的唯一方法:否则所有上下文都将接收所有事件。最简单的方法是使用分区策略(例如,以 0 结尾的 ID 转到 context-0,或者您监控的每台机器都有一个上下文等),因为这样每个关注点都在相同的上下文中进行跟踪,而您不需要不必共享状态。

当它们到达时,我是否可以有多个上下文处理相同的事件,循环方式?

这对我来说并不完全清楚。你在这里的目的是什么?如果您希望通过让“下一个可用”上下文接收事件来减少延迟,这可能不是实现它的正确方法 - 决定哪个上下文处理事件意味着您需要上下文间通信和协调,这将增加延迟。如果您希望多个上下文处理相同的事件(例如,一个上下文运行您的温度峰值规则,另一个运行您的长期温度平均规则,但两者都将温度读数作为输入),那么这是一个好方法,但它不是我的会叫循环赛。

于 2018-09-28T10:14:10.667 回答