我正在尝试定义一个监视器,在该监视器中我接收事件,然后在多个上下文中处理它们(如果我理解正确,大致相当于线程),我知道我可以编写
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中定义此方法的最佳方法是什么?还可以让多个上下文在它们到达时以循环方式处理相同的事件吗?
答案 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,或者您正在监视的每台计算机有一个上下文,等等),因为这样可以跟踪每个问题在相同的上下文中,您不必共享状态。
我还可以让多个上下文在它们到达时以循环方式处理相同的事件吗?
这对我来说还不是很清楚。您的目标是什么?如果您想通过让“下一个可用”上下文拾取事件来减少延迟,则这可能不是实现此事件的正确方法-确定事件处理的上下文意味着您需要进行上下文间通信,协调,这会增加延迟。如果您希望多个上下文处理相同的事件(例如,一个上下文运行您的温度峰值规则,而另一个运行您的长期温度平均值规则,但都将温度读数作为输入),那么这是一个好方法,但我不是会叫循环赛。