2013-06-12 5 views
1

Я хочу расширить продукт Wso2 CEP в наших целях и попытаться написать пользовательское условие, как указано в этом official wso2 cep link.Запись пользовательского условия в WSO2 CEP с аргументом слева и справа

Я могу написать класс расширения, который расширяет «org.wso2.siddhi.core.executor.conditon.AbstractGenericConditionExecutor» и реализовать свой абстрактный метод, как указано ниже:

@SiddhiExtension(namespace = "myext", function = "startswithA") 
public class StringUtils extends 
     org.wso2.siddhi.core.executor.conditon.AbstractGenericConditionExecutor { 

    static Log log = LogFactory.getLog(StringUtils.class); 

    @Override 
    public boolean execute(AtomicEvent atomicEvent) { 
     log.error("Entered the execute method"); 
     log.error("Atomic event to string: " + atomicEvent.toString()); 

     return true; 
    } 
} 

, когда я использую этот extensioned Способ:

from allEventsStream[myext:startswithA(name)] 
insert into selectedEventsStream *; 

в этой ситуации, я хочу, что метод startswithA возвращает истину, если имя поля имеет «A» в начале этого. Однако, когда я запускаю этот запрос в CEP, все событие переходит в мою функцию выполнения, т. Е. Нет знака, чтобы показать, что я отправляю поле «имя», которое отправляется для запуска в качестве метода.

Как я могу понять, какое поле потока отправлено моему расширенному методу в качестве аргумента?

Также я хочу писать условия, такие как

from allEventsStream[myext:startswith('A', name)] 
insert into selectedEventsStream *; 

Как я могу achive это?

ответ

3

В «AbstractGenericConditionExecutor» есть еще один метод, который дает вам набор мимических исполнителей, которые включены в параметрах, когда исполнитель конкретизирует:

public void setExpressionExecutors(List<ExpressionExecutor> expressionExecutors) 

Вы не обязательно должны переопределить этот метод и хранить список , он уже хранится там в «AbastractGenericConditionExecutor» в виде списка с именем expressionExecutors. Вы можете передать событие этим исполнителям для получения соответствующих значений из события по порядку.

Например, если вы включили переменную (например, «имя») в запрос (в качестве параметра в индексе 0), вы получите «VariableExpressionExecutor» в списке по индексу 0, который выберет вас значение переменной из события. Аналогично для константы, такой как «A», вы получите другого исполнителя, который даст вам значение «A» при вызове.

+0

Спасибо @lasantha и Раджив Сампатх, что прошло очень хорошо. – Alper

2

Чтобы добавить к отвечу Раджива, если вы хотите отфильтровать все имена, начинающиеся с «А», вы можете переопределить метод выполнения своего пользовательского расширения Сиддхи, аналогичный следующему сегменту.

@Override 
public boolean execute(AtomicEvent atomicEvent) { 
    if(!this.expressionExecutors.isEmpty()) { 
     String name = (String)this.expressionExecutors.get(0).execute(atomicEvent); 
     if(name.startsWith("A")) { 
      return true; 
     } 
    } 
    return false; 
} 

При написании запроса, он будет похож на

from allEventStream[myext:startsWithA(name)] 
insert into filteredStream *; 

Вы можете расширить это поведение для достижения расширения, которое поддерживает

from allEventsStream[myext:startswith('A', name)] 

запросов типа, а также.

НТН,

Ласанта

 Смежные вопросы

  • Нет связанных вопросов^_^