我想根据我们的需求扩展Wso2 CEP产品,并尝试编写自定义条件,如official wso2 cep link所示。
我能够编写一个扩展类,扩展“org.wso2.siddhi.core.executor.conditon.AbstractGenericConditionExecutor”并实现其抽象方法,如下所示:
@SiddhiExtension(namespace = "myext", function = "startswithA")
public class StringUtils extends
org.wso2.siddhi.core.executor.conditon.AbstractGenericConditionExecutor {
static Log log = LogFactory.getLog(StringUtils.class);
@Override
public boolean execute(AtomicEvent atomicEvent) {
log.error("Entered the execute method");
log.error("Atomic event to string: " + atomicEvent.toString());
return true;
}
}
当我使用这个扩展方法时:
from allEventsStream[myext:startswithA(name)]
insert into selectedEventsStream *;
在这种情况下,我希望如果名称字段在其开头有“A”,则startwithA方法返回true。但是当我在CEP中运行此查询时,整个事件都会进入我的执行函数,即没有迹象表明我发送“name”字段被发送到startswithA方法作为参数。
我如何理解流的哪个字段作为参数发送到我的扩展方法?
我也想写像
这样的条件from allEventsStream[myext:startswith('A', name)]
insert into selectedEventsStream *;
我怎么能做到这一点?
答案 0 :(得分:3)
在'AbstractGenericConditionExecutor'中,还有另一种方法可以为您提供执行程序实例化时参数中包含的表达式执行程序集:
public void setExpressionExecutors(List<ExpressionExecutor> expressionExecutors)
您不一定要覆盖此方法并存储列表,它已经作为名为expressionExecutors
的列表存储在'AbastractGenericConditionExecutor'中。您可以将事件传递给这些执行程序,以便按顺序从事件中检索相关值。
例如,如果在查询中包含一个变量(如'name')(作为索引0处的参数),您将在索引0的列表中获得一个'VariableExpressionExecutor',它将获取值来自事件的变量。类似地,对于像'A'这样的常量,你会得到一个不同的执行器,在调用时会给你'A'值。
答案 1 :(得分:2)
要添加Rajeev的答案,如果要过滤所有以'A'开头的名称,您可以覆盖自定义Siddhi扩展的执行方法,类似于以下段。
@Override
public boolean execute(AtomicEvent atomicEvent) {
if(!this.expressionExecutors.isEmpty()) {
String name = (String)this.expressionExecutors.get(0).execute(atomicEvent);
if(name.startsWith("A")) {
return true;
}
}
return false;
}
编写查询时,它类似于
from allEventStream[myext:startsWithA(name)]
insert into filteredStream *;
您可以扩展此行为以实现支持
的扩展from allEventsStream[myext:startswith('A', name)]
也是类型查询。
HTH,
Lasantha