WSO2中的自定义执行功能

时间:2017-05-01 23:49:31

标签: wso2 wso2cep

我正在尝试为WS02(4.2.0)编写一个简单的自定义函数扩展。我的函数基本上接受一个String并返回大写。这是更高级自定义功能的第一步POC。

我实现了一个扩展org.wso2.siddhi.core.executor.function.FunctionExecutor类的类,并创建了一个ams.siddhiext文件。然后我使用maven-bundle插件将类和siddhiext打包在一个JAR文件中。

我的函数类看起来像这样

public class AnomalyDetector extends FunctionExecutor {

private final static Logger LOG = LoggerFactory.getLogger(AnomalyDetector
        .class);

@Override
protected void init(ExpressionExecutor[] expressionExecutors, ExecutionPlanContext executionPlanContext) {
    LOG.info("In AD:init()");
}

@Override
protected Object execute(Object[] objects) {
    return null;
}

@Override
protected Object execute(Object o) {
    LOG.info("In AD:process(" + o.toString() + ")");
    String eventData = (String) o;
    LOG.info("Event data : " + eventData);
    if (eventData != null) {
        return eventData.toUpperCase();
    } else {
        return "Null event data";
    }
}

@Override
public void start() {
    LOG.info("In AD:start()");
}

@Override
public void stop() {
}

@Override
public Map<String, Object> currentState() {
    return null;
}

@Override
public void restoreState(Map<String, Object> map) {

}

@Override
public Attribute.Type getReturnType() {
    return Attribute.Type.STRING;
}

}

然后我把jar放在/ repository / components / lib /中,因为/ repository / components / dropins /没有把它拿起来。

我目前有2个问题阻止了我。

  1. 我想写一个简单的执行计划,它从输入流(String)获取一个值,调用我的自定义函数并将输出写入导出流。
  2. @Plan:名称(&#39; AMSExecutionPlan&#39)

    @Import(&#39; AMSStream:1.0.0&#39;) 定义流amsStream(metrics_json string);

    @Export(&#39; AnomalyStream:1.0.0&#39;) define stream anomalyStream(异常字符串);

    来自amsStream 选择ams:findAnomaly(metrics_json)为异常 插入anomalyStream

    我收到以下验证错误。 enter image description here

    我的执行计划可能出现什么问题?

    1. 每当我更改自定义函数类时,重建jar并在wso2类路径中替换它,然后重新启动ws02,我看不到ws02中反映的更改。我在自定义函数类中打印的日志行反映了旧版本的代码。如何在实时ws02实例上更改我的自定义函数类?
    2. 提前致谢!

2 个答案:

答案 0 :(得分:0)

你可以将jar捆绑为OSGI包并试试吗?将jar转换为OSGI包时可能会出现问题。

答案 1 :(得分:0)

  1. 您指出的验证错误表明您的扩展程序未正确返回返回类型。但我可以看到你正确实现了getReturnType()。因此,由于问题2,您的源代码和实际运行代码可能无法同步。所以我们先解决这个问题。

  2. 在WSO2服务器中,lib文件夹用于为OSGi依赖项添加非OSGi依赖项和dropins。事实上,它在lib而不是dropins中工作表明你的jar没有打包成捆。要实现这一点,请从String扩展名下面的pom文件。有两点需要注意。

  3. [1]捆绑包装的使用

    [2]捆绑插件的用法

    更新你的pom引用它,然后你就可以直接将你的包添加到dropins了。这也是您未能反映更改的原因。将jar添加到lib服务器时,会在内部将其转换为OSGi包并添加到dropins。现在,当您再次更新lib中的jar时,dropins中的jar将不会更新。这将是旧捆绑。因此,没有反映出变化。当您更新pom并正确构建捆绑包时,此问题也将消失。

    [1] https://github.com/wso2/siddhi/blob/v3.1.0/modules/siddhi-extensions/string/pom.xml#L29

    [2] https://github.com/wso2/siddhi/blob/v3.1.0/modules/siddhi-extensions/string/pom.xml#L57

    希望这会有所帮助!!