我正在尝试为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中
我收到以下验证错误 .
我的执行计划可能出现什么问题?
- 每当我更改自定义函数类时,重建jar并在wso2类路径中替换它,然后重新启动ws02,我看不到ws02中反映的更改 . 我在自定义函数类中打印的日志行反映了旧版本的代码 . 如何在live ws02实例上更改自定义函数类?
提前致谢!
2 回答
你可以将jar捆绑为OSGI包并试试吗?将jar转换为OSGI包时可能会出现问题 .
您指出的验证错误表明您的扩展程序未正确返回返回类型 . 但我可以看到你正确实现了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
希望这可以帮助!!