Пользовательская функция выполнения в WSO2

Я пытаюсь написать простое расширение пользовательской функции для WS02 (4.2.0). Моя функция в основном принимает строку и возвращает верхний регистр. Это должно быть первым шагом POC для более продвинутой пользовательской функции.

Я реализовал класс, расширяющий класс org.wso2.siddhi.core.executor.function.FunctionExecutor, и создал файл ams.siddhiext. Затем я упаковал класс и siddhiext в файл JAR, используя плагин maven-bundle.

Мой класс функций выглядит так

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;
}

}

Затем я поместил банку в /repository/components/lib/, так как /repository/components/dropins/ не поднял ее.

У меня есть 2 проблемы, которые блокируют меня в настоящее время.

  1. Я хотел написать простой план выполнения, который берет значение из входного потока (String), вызывает мою пользовательскую функцию и записывает вывод в поток экспорта.

@Plan:имя('AMSExecutionPlan')

@Import('AMSStream:1.0.0') определить поток amsStream (строка metrics_json);

@Export('AnomalyStream:1.0.0') определить поток anomalyStream (строка аномалии);

из amsStream выберите ams:findAnomaly(metrics_json), поскольку аномалия вставляется в anomalyStream

Я получаю следующую ошибку проверки. введите здесь описание изображения

Что может быть не так с моим планом выполнения?

  1. Всякий раз, когда я меняю свой пользовательский класс функций, перестраиваю банку и заменяю ее в пути к классам wso2, а затем перезапускаю ws02, я не вижу изменений, отраженных в ws02. Строки журнала, которые я распечатываю в своем пользовательском классе функций, отражают более старую версию кода. Что мне нужно сделать, чтобы внести изменения в мой класс пользовательских функций в реальном экземпляре ws02?

Заранее спасибо!


person arav369    schedule 01.05.2017    source источник


Ответы (2)


Можете ли вы связать банку с пакетом OSGI и попробовать? Может возникнуть проблема при преобразовании jar в пакет OSGI.

person Fathima    schedule 02.05.2017

  1. Указанная вами ошибка проверки предполагает, что ваше расширение не возвращает возвращаемый тип должным образом. Но я вижу, что вы правильно реализовали getReturnType(). Таким образом, ваш исходный код и реальный работающий код могут быть не синхронизированы из-за проблемы 2. Итак, давайте сначала рассмотрим это.

  2. На серверах WSO2 папка lib используется для добавления зависимостей, отличных от OSGi, и вставок для зависимостей OSGi. Тот факт, что он работает в lib, а не в dropins, предполагает, что ваша банка не упакована как пакет. Для этого следуйте приведенному ниже файлу pom из расширения String. Следует отметить две вещи.

[1] Использование пакетной упаковки

[2] Использование подключаемого модуля пакета

Обновите свой pom, указав это, и тогда вы сможете напрямую добавить свой пакет в dropins. Также это причина, по которой ваши изменения не отражаются. Когда вы добавите свою банку на сервер lib, она будет внутренне преобразована в пакет OSGi и добавлена ​​​​в dropins. Теперь, когда вы снова обновите jar в lib, тот, что в dropins, не будет обновляться. Это будет старый пакет. Поэтому изменения не отражаются. Эта проблема также исчезнет, ​​когда вы обновите 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

Надеюсь это поможет!!

person Tishan    schedule 02.05.2017