WSO2中的自定义执行函数

WSO2中的自定义执行函数,wso2,wso2cep,Wso2,Wso2cep,我正在尝试为WS02(4.2.0)编写一个简单的自定义函数扩展。我的函数基本上接受字符串并返回大写。这是实现更高级自定义功能的第一步POC 我实现了一个扩展org.wso2.siddhi.core.executor.function.FunctionExecutor类的类,并创建了一个ams.siddhiext文件。然后,我使用maven bundle插件将类和siddhiext打包到一个JAR文件中 我的函数类是这样的 public class AnomalyDetector extends

我正在尝试为WS02(4.2.0)编写一个简单的自定义函数扩展。我的函数基本上接受字符串并返回大写。这是实现更高级自定义功能的第一步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;
}
公共类异常检测器扩展FunctionExecutor{
私有最终静态记录器日志=LoggerFactory.getLogger(异常检测器
(类别),;
@凌驾
受保护的void init(ExpressionExecutor[]expressionExecutors,ExecutionPlanContext ExecutionPlanContext){
LOG.info(“在AD:init()中”);
}
@凌驾
受保护对象执行(对象[]对象){
返回null;
}
@凌驾
受保护对象执行(对象o){
LOG.info(“在AD:process(“+o.toString()+”);
字符串eventData=(字符串)o;
LOG.info(“事件数据:+eventData”);
if(eventData!=null){
返回eventData.toUpperCase();
}否则{
返回“空事件数据”;
}
}
@凌驾
公开作废开始(){
LOG.info(“在AD:start()中”);
}
@凌驾
公共停车场(){
}
@凌驾
公共映射currentState(){
返回null;
}
@凌驾
公共屋(地图){
}
@凌驾
公共属性。类型getReturnType(){
返回Attribute.Type.STRING;
}
}

然后我将jar放在/repository/components/lib/since/repository/components/dropins/中,但没有拾取它

我目前有两个问题阻碍了我

  • 我想编写一个简单的执行计划,从输入流(字符串)获取一个值,调用我的自定义函数并将输出写入导出流
  • @计划:名称('AMSExecutionPlan')

    @导入('AMSStream:1.0.0') 定义流amsStream(metrics\u json字符串)

    @导出(“异常流:1.0.0”) 定义流异常流(异常串)

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

    我得到以下验证错误。

    我的执行计划有什么问题

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

  • 提前谢谢

    你能把jar打包成一个OSGI包然后试试吗?将jar转换为OSGI捆绑包时可能会出现问题。

    能否将jar打包为OSGI捆绑包并重试?将jar转换为OSGI包时可能会出现问题

  • 您指出的验证错误表明扩展没有正确返回返回类型。但是我可以看出您已经正确地实现了getReturnType()。因此,由于问题2,您的源代码和实际运行的代码可能无法同步。那么让我们先解决这个问题

  • 在WSO2服务器中,lib文件夹用于添加非OSGi依赖项和OSGi依赖项的dropins。它在lib而不是dropins中工作的事实表明,您的jar并不是打包的。要实现这一点,请遵循以下pom文件的字符串扩展名。有两件事需要注意

  • [1] 捆绑包装的使用

    [2] bundle插件的使用

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

    [1]

    [2]

    希望这有帮助

  • 您指出的验证错误表明扩展没有正确返回返回类型。但是我可以看出您已经正确地实现了getReturnType()。因此,由于问题2,您的源代码和实际运行的代码可能无法同步。那么让我们先解决这个问题

  • 在WSO2服务器中,lib文件夹用于添加非OSGi依赖项和OSGi依赖项的dropins。它在lib而不是dropins中工作的事实表明,您的jar并不是打包的。要实现这一点,请遵循以下pom文件的字符串扩展名。有两件事需要注意

  • [1] 捆绑包装的使用

    [2] bundle插件的使用

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

    [1]

    [2]

    希望这有帮助