О написании пользовательского OutputAttributeProcessor

У меня есть несколько вопросов о написании пользовательского OutputAttributeProcessor. Я использую WSO2 CEP 2.1.0 и сиддхи 1.1.0.

Я хочу создать собственный OutputAttributeProcessor, поэтому я создаю два класса Java: TestFactory реализует OutputAttributeProcessorFactory, а Test реализует OutputAttributeProcessor. Пакет из двух классов — org.wso2.siddhi.extention.

TestFactory должен переопределить createAggregator и getProcessorType, а Test должен переопределить createNewInstance, getType, processInEventAttribute и processRemoveEventAttribute.

Первый вопрос касается каждого метода.

Что должно быть написано в getProcessorType?

А также чем отличаются между processInEventAttribute и processRemoveEventAttribute?

Кроме того, у меня есть еще один вопрос. Я создам файл jar, состоящий из двух классов Java. Я добавляю файл jar в путь к классам в /repository/components/lib и полное имя класса для TestFactory в файл siddhi.extension, расположенный в /repository/conf/siddhi.

Что содержит siddhi.extension?

Является ли следующая строка?

org.wso2.siddhi.extention.TestFactory

Если есть пример программы для пользовательского OutputAttributeProcessor, пожалуйста, научите меня.

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


person user2743651    schedule 06.11.2013    source источник


Ответы (1)


Что должно быть написано в getProcessorType?

В зависимости от варианта использования здесь вы можете вернуть один из типов АГРЕГАТОРА или ПРЕОБРАЗОВАТЕЛЯ:

@Override
public ProcessorType getProcessorType() {
    return OutputAttributeProcessorFactory.ProcessorType.AGGREGATOR;
}

Каков именно ваш вариант использования? Как следует из названия, вы можете использовать тип AGGREGATOR, если он выполняет агрегацию (т. е. что-то вроде вычисления среднего, получения min() нескольких событий и т. д.).

А также чем отличаются между processInEventAttribute и processRemoveEventAttribute?

Это два метода, которые используются для добавления и удаления событий в/из вашего OutputAttributeProcessor. Например, если вы берете среднее значение, это нужно сделать для определенного набора событий (например, скользящего окна, обычно не всех полученных событий), который изменяется динамически. Поэтому, когда вы получаете событие через processInEventAttribute(), вы можете обновить среднее значение, включая это событие. Аналогично, когда вызывается processRemoveEventAttribute(), вы можете обновить среднее значение, удалив это событие. В качестве примера см. приведенный ниже пример кода, который вычисляет среднее значение как двойное значение.

private double value = 0.0;
private long count=0;

public Attribute.Type getType() {
    return Attribute.Type.DOUBLE;
}


@Override
public Object processInEventAttribute(Object obj) {
    count++;
    value += (Double) obj;
    if (count == 0) {
        return 0;
    }
    return value / count;
}

@Override
public Object processRemoveEventAttribute(Object obj) {
    count--;
    value -= (Double) obj;
    if (count == 0) {
        return 0;
    }
    return value / count;
}

Что содержит siddhi.extension?

Это всего лишь одна строка, как вы упомянули. Просто полное имя класса.

org.wso2.siddhi.extention.TestFactory
person Rajeev Sampath    schedule 07.11.2013