2016-12-01 4 views
0

Я пытаюсь написать правило слюни, которое проверяет, происходят ли два события из одного потока. У меня есть класс правил соответствия, который содержит логику (в рабочей памяти) для сравнения с событиями, поступающими из точки входа. все, что мне нужно, - это обнаружить появление двух событий, например, я хочу обнаружить, что произошло событие А и после этого произошло Б. Я написал эту роль в синтаксисе слюниКак выбрать 2 разных атрибута из события в Drools

$comrule : Comprules (pattern == "response" , isBefore == false) 
Event (task == $comrule.antecedent) from entry-point StoreOne 
Event (task == $comrule.consequent) from entry-point StoreOne 

проблема в этом методе не работает. только один рабочий, когда я писал этот

Event (task == $comrule.antecedent) from entry-point StoreOne 
not Event (task == $comrule.consequent) from entry-point StoreOne 

Я прочитал документацию Drools, но я не мог найти решения этой проблемы любая помощь будет оценена

+0

Невозможно сказать, почему вы не получите ожидаемого результата. Вам нужно предоставить полный пример. - Вы ввели два факта «Event» с правильными значениями для 'task' и были ли они в рабочей памяти одновременно? Если вторая версия шаблонов срабатывает, вы вставили первый, но еще не второй. – laune

+0

это вход, который я вставил \t insertEvent (entryPointStoreOne, new Event(), "X", "8"); \t insertEvent (entryPointStoreOne, новое событие(), «Y», «9»); Comprules cr4 = новый Comprules(); \t cr4.setpattern («response»); \t cr4.setantecedent ("X"); \t cr4.setconsequent ("Y"); \t cr4.setanttimestamp (3); \t cr4.setconsimesptamp (4); \t cr4.settimespan (2); –

ответ

0

Типичный образец для проверки, что два события происходят в правильном порядке, это:

Comprules(pattern == "response", !isBefore, $a: antecedent, $b: consequent) 
$one: Event(task == $a) from entry-point StoreOne 
$two: Event(task == $b, this after $one) from entry-point StoreOne 

Использование not испытания на отсутствие факта, что было бы ситуация после того, как $one прибыл в то время как $two все еще является bsent.

+0

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

+0

Я пробовал этот код, но он не работает. это типичный ввод, который я использовал ... для фактов в рабочей памяти (в нашем случае класс правил соответствия) 'Comprules cr4 = new Comprules(); cr4.setpattern («response»); cr4.setantecedent ("X"); cr4.setconsequent ("Y"); ' для событий, поступающих из потока ' insertEvent (entryPointStoreOne, new Event(), "X", "8"); insertEvent (entryPointStoreOne, new Event(), «Y», «9»); ' он должен работать так, как если бы Y происходило после X, правило должно быть запущено –

+0

Этого недостаточно для определения того, почему он не работает. Какие параметры вы использовали для создания сеанса? Какая временная метка ваших событий? Какие часы вы используете? – laune