1

我想根据我们的需要扩展 Wso2 CEP 产品,并尝试编写一个自定义条件,如这个官方 wso2 cep 链接中所示。

我能够编写扩展“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”,我希望startswithA 方法返回true。但是,当我在 CEP 中运行此查询时,整个事件会进入我的执行函数,即没有迹象表明我发送“名称”字段作为参数发送到startswithA 方法。

我如何理解流的哪个字段作为参数发送到我的扩展方法?

我也想写条件

from allEventsStream[myext:startswith('A', name)]
insert into selectedEventsStream *;

我怎样才能做到这一点?

4

2 回答 2

3

在“AbstractGenericConditionExecutor”中,还有另一种方法可以为您提供一组表达式执行器,这些执行器在执行器实例化时包含在参数中:

public void setExpressionExecutors(List<ExpressionExecutor> expressionExecutors)

您不必重写此方法并存储该列表,它已作为名为 的列表存储在“AbastractGenericConditionExecutor”中expressionExecutors。您可以将事件传递给这些执行器,以便按顺序从事件中检索相关值。

例如,如果您在查询中包含一个变量(如“名称”)(作为索引 0 处的参数),您将在索引 0 处的列表中获得一个“VariableExpressionExecutor”,它将获取变量的值从事件。类似地,对于像“A”这样的常量,您将获得一个不同的执行程序,它会在调用时为您提供值“A”。

于 2013-06-12T09:19:18.843 回答
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)]

类型查询也是如此。

高温下,

拉桑塔

于 2013-06-12T10:01:03.397 回答