如何让多个上下文处理Apama中的事件

时间:2018-09-28 09:14:11

标签: events apama

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

module.exports = {
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'ify-loader'
    }]
  },
};

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

但是我希望有一个动作可以在事件进入显示器时对事件做出响应:

spawn myAction() to myNewContext; 

我可以通过使用特定上下文的方式来定义我的on all trigger() as t { doMyThing() } on all otherTrigger() as ot { doMyOtherThing() } 吗?

on all

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

2 个答案:

答案 0 :(得分: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();
    }
}

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

答案 1 :(得分:4)

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

  

我还可以让多个上下文在它们到达时以循环方式处理相同的事件吗?

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