Я пытаюсь разработать систему правил, в которой сами правила могут быть настроены извне, используя объект конфигурации правил. В частности, я хочу внешне настроить определение правила DRL, каким должно быть минимальное время между срабатываниями правила для определенного типа правила.
Мой подход до сих пор заключается в том, чтобы вставить конфигурацию правила как факт ValueRuleSpec:
rule "Any value detected"
when
$r : ValueRuleSpec(mode == ValueRuleSpecMode.ANY(), $devices: devices)
$e : SensorEvent(deviceId memberOf $devices) from entry-point FMSensorEvents
not Activation(ruleSpec == $r, cause == $e)
then
insert(new Activation($r, $e));
end
Объект $r ValueRuleSpec имеет свойство triggerEvery, которое содержит минимальное количество секунд между активациями. Я знаю, что это можно сделать статически, проверив отсутствие объекта активации, который находится внутри определенного диапазона перед $e, используя что-то вроде:
not Activation(this before[60s, 0s] $e)
Как я могу сделать это с настраиваемым временным окном, используя свойство $r.triggerEvery в качестве количества секунд?
before
,after
и т. д., являются просто синтаксическим сахаром для определенных условий, включающих метки времени событий, на которые ссылается временное выражение. (Определения операторов вы найдете в руководстве по Drools.) Написание функции DRL статического метода, которая вычисляет то же самое отношение, но включает параметры, поступающие из третьего факта, не должно быть слишком сложным. Возможно, вам потребуется указать временную метку в качестве поля события, установленного кодом Java при вставке события. - person laune   schedule 28.12.2017