#drools #rule-engine
#drools #механизм правил
Вопрос:
Мой случай таков: если сумма снятия с моего банковского счета превышает 1000 долларов в течение любых продолжающихся 10 минут, например, 0-10 минут, а затем 0-1-10m1s, затем 0m2s-10m2s, что является скользящим временным окном, банковская система должна отправить мне предупреждающее сообщение.
Итак, кто-нибудь может помочь мне написать правило с помощью Drools?
Моя первоначальная идея приведена ниже:
when
Number( $total : intValue, intValue >= 1000)
from accumulate (Withdraw ($money : money)
over window:time( 10m )
from entry-point ATMEntry,
sum($money))
then
System.out.println("Warning! too more withdraw:" $total);
Тем не менее, он просто проверит предстоящие 10m за один раз. После первых 10 м, независимо от того, сколько объектов вывода, которые я вставляю в ATMEntry, я не получу предупреждающее сообщение.
И если я запускаю указанный выше интервал правил в другом сеансе, например, каждые 1 м, это приводит меня в замешательство по поводу того, как вставить объект вывода в ATMEntry для другого сеанса.
Итак, возможно ли использовать Drools в моем случае?
Спасибо,
Ответ №1:
Вы должны инициировать оценку другим событием вывода:
when
Withdraw()
Number( $total : intValue >= 1000)
from accumulate (Withdraw ($money : money)
over window:time( 10m )
from entry-point ATMEntry,
sum($money))
then
System.out.println( "Warning! " $total );
end
Если вам нужны отдельные события, возможно, было бы лучше собрать их в список. Это также может помочь закрыть один интервал с избыточным выводом и открыть другой. Это зависит от деталей спецификации: когда подавать сигнал тревоги, и когда подавать — или не подавать — следующий сигнал тревоги.
Комментарии:
1. Спасибо за ваш ответ. На самом деле, я не знаю, когда наступит следующее событие. Итак, я не смог собрать их в список. Итак, мне нужны drools для наблюдателя каждые 10 минут. Например, 0m-10m, затем 0m1s-10m1s, затем 0m2s-10m2s, что является скользящим окном. И я просто передаю каждое событие в одном сеансе по одному элементу в режиме реального времени. Может ли Drools поддерживать эту функцию?
2. Вы можете написать правило, которое срабатывает при выводе средств. Затем вы можете искать другие в течение последних 10 минут. — Если вы смотрите на фиксированное время, вы можете что-то пропустить.
3. Итак, вы имеете в виду, что мне нужно запускать правило при поступлении нового отзыва, верно? А как насчет сеанса? Должен ли я использовать тот же сеанс для его запуска?
4. В этих сценариях вам обычно требуется один сеанс, который выполняется непрерывно. Но вам может не понадобиться выполнять обнаружение мошенничества в режиме реального времени — вы все равно не сможете отправить группу к банкомату. Если вы периодически запускаете это приложение, вам нужно убедиться, что прерывания обрабатываются правильно, т. Е. без пропуска избыточного овердрафта.