Создание более сложных EPN в Esper CEP

Я только что реализовал простой пример Esper CEP на java. Подобно пример.

Configuration config = new Configuration();
            config.addEventType("SensorEvent",
                    test.SensorEvent.class.getName());
            EPServiceProvider epService = EPServiceProviderManager
                    .getDefaultProvider(config);

            String expression = "select * from SensorEvent where sensor11 >= 1.00";

            EPStatement statement = epService.getEPAdministrator().createEPL(expression);

            MyListener listener = new MyListener();

            statement.addListener(listener);

Однако в этом примере предполагается только простой фильтр EPA. Теперь я хотел бы объединить несколько EPA во время выполнения, как показано в следующем примере. К сожалению, я не могу найти примеров для такой реализации:  введите описание изображения здесь У кого-нибудь есть пример ?.

заранее спасибо

Изменить: до сих пор я делал это так, как сказал user650839:

String expression = "@name('EPA1') insert into EPA1 select * from SensorEvent where sensor11 >= 1";
        String expression2 = "@name('EPA2') insert into EPA2 select * from SensorEvent where sensor12 >= 1";
        String expression3 ="@name('EPA3') select * from EPA1#time(100) as epa1, EPA2#time(200) as epa2 where epa1.id = epa2.id";
EPStatement statement = epService.getEPAdministrator().createEPL(expression);
            EPStatement statement2 = epService.getEPAdministrator().createEPL(expression2);
            EPStatement statement3 = epService.getEPAdministrator().createEPL(expression3);
 MyListener listener = new MyListener();

            statement.addListener(listener);
            statement2.addListener(listener);
            statement3.addListener(listener);

Код отлично скомпилирован, но мой обработчик событий также реагирует, когда датчик 12 меньше 1. Так что я думаю, достаточно, если одно из моих утверждений истинно, но мой обработчик событий должен реагировать только в том случае, если все утверждения истинны.


person Leon    schedule 15.12.2018    source источник


Ответы (1)


@name('EPA1') insert into EPA3 select * from SensorEvent(sensor11>1);
@name('EPA2') insert into EPA3 select * from SensorEvent(sensor11<1);
@name('EPA3') select count(*) from EPA3

а может быть, в зависимости от того, что именно означает рисунок

@name('EPA1') insert into EPA1 select * from SensorEvent(sensor11>1);
@name('EPA2') insert into EPA2 select * from SensorEvent(sensor11<1);
@name('EPA3') select * from EPA1#time(10) as epa1, EPA2#time(20) as epa2 where epa1.sensorId = epa2.sensorId

Возможно, шаблоны решений вдохновят вас и дальше.

person user650839    schedule 15.12.2018
comment
Значит, вы имеете в виду, что я могу просто использовать ваш первый пример как строку выражения? Примерно так: Строковое выражение3 = @ name ('EPA1') вставить в EPA3 select * from SensorEvent (sensor11 = 1); \ n + @name ('EPA2') вставить в EPA3 select * from SensorEvent (sensor12 = 1); \ n + @name ('EPA3') выберите количество (*) из EPA3; Оператор EPStatement3 = epService.getEPAdministrator (). CreateEPL (выражение); MyListener listener = новый MyListener (); statement3.addListener (слушатель); - person Leon; 16.12.2018
comment
Я спрашиваю об этом, потому что, когда я пытаюсь запустить свой код, я получаю следующую ошибку: com.espertech.esper.client.EPStatementSyntaxException: неправильный синтаксис рядом с ';' в строке 1 столбца 68 проверьте, что предложение from [@name ('EPA1') вставлено в EPA3, выберите * from SensorEvent (sensor11 = 1); @name ('EPA2') вставить в EPA3 выбрать * из SensorEvent (sensor12 = 1); @name ('EPA3') выберите количество (*) из EPA3] - person Leon; 16.12.2018
comment
Esper 8 и новее: просто скомпилируйте. Esper 7 и старше: используйте модули - person user650839; 17.12.2018
comment
поэтому я кое-что попробовал и установил Esper 8. Код с моим более сложным оператором также будет скомпилирован без ошибок, но мой CEP распознает только первый оператор. последующие утверждения после первого EPL будут полностью проигнорированы. Это мой код: - person Leon; 20.12.2018
comment
Строка EPL3 = @ name ('EPA1') вставить в EPA1 select i, id из IEvent, где i ›4; \ n + @name ('EPA2') вставить в EPA2 select j, id из IEvent, где j› 6; \ n + @name ('EPA4') вставить в EPA4 выбрать x, id из IEvent, где x ›4; \ n + @name ('EPA3') вставить в EPA3 выбрать epa1.i как i, epa2.j как j, epa2. id как id из EPA1 # время (100) как epa1, EPA2 # время (100) как epa2, где epa1.id = epa2.id; \ n + @name ('EPA5') выберите * из EPA4 # время (100) как epa4, EPA3 # time (100) как epa3, где epa3.id = epa4.id ;; - person Leon; 20.12.2018