首页 文章

WSO2中的自定义执行功能

提问于
浏览
1

我正在尝试为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个问题阻止了我 .

  • 我想写一个简单的执行计划,它从输入流(String)获取一个值,调用我的自定义函数并将输出写入导出流 .

@Plan:名称( 'AMSExecutionPlan')

@Import('AMSStream:1.0.0')定义流amsStream(metrics_json string);

@Export('AnomalyStream:1.0.0')定义流anomalyStream(异常字符串);

从amsStream中选择ams:findAnomaly(metrics_json)作为异常插入到anomalyStream中

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

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

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

提前致谢!

2 回答

  • 0

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

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

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

    [1]捆绑包装的用法

    [2] bundle插件的用法

    更新你的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

    希望这可以帮助!!

相关问题