Вопрос по – Слюни отключают правило во время выполнения

8

Я начинаю проект с Drools и Drools Guvnor.

Мои правила развернуты в слюни Гувнор. Мой экземпляр механизма правил может обращаться к этим правилам через файл pkg, предоставляемый drools Guvnor, когда вы делаете сборку и выпуск релиза пакета.

Все это работает нормально, и я ищу решение для отключения правила во время выполнения.

Единственное решение, которое у меня есть сейчас, - это зайти в guvnor, заархивировать правило и выполнить сборку + релиз пакета, содержащего это правило.

Есть ли другая стратегия?

Ваш Ответ

2   ответа
0

Вы можете добавить условие существования какого-либо факта в рабочей памяти. Что-то вроде:

rule "RuleA"
when
  not( RuleADisabled() )
  ....
then
  ....
end

и отключите правило в коде Java:

ksession.insert( new RuleADisabled() );
Вы можете создать только один тип факта, например RuleDisabled с атрибутом ruleName или несколькими правилами может зависеть от одного и того же факта, например не (RuleDisabled (group == & quot; groupX & quot;))
Спасибо, но это означает, что для каждого нового правила я должен создать новый тип факта RuleNameDisabled. Каждый раз, когда я буду выполнять свои правила, мне сначала нужно будет вставить факты об отключенных правилах. Frederic Close
5

Есть несколько способов решения этой проблемы, в зависимости от ваших требований и архитектуры.

  • One way is to define each subset of your rules in different guvnor packages. When building your kbase, you can load only the packages with the rules you want for that kbase in particular.

  • Another way is to always load all the rules, but use an "enabled" expression do dynamically enable/disable rules. Please note that the rules in this case are still evaluated, but they can be prevented from activating. This is a useful technique for cases where you want to enable/disable rules based on the facts you insert into your session. E.g.:

    rule X enabled( ) then ...

    The boolean expression above has access to the variable bindings from the condition of your rule, as well as rule attributes, annotations and obviously you can also access static methods in helper classes if you want to define the conditions to activate the rule external to the DRL file.

  • A third way of doing it is by using agenda filters. In this case you load all your rules, create the session with the facts and when executing the rules you use an agenda filter. An agenda filter is an interface that you can implement yourself or you can use some of the filters that ship with Drools. The filter is called before firing each rule and can then veto or allow the engine to execute the rule. Please note that in this case all rules are evaluated and activated, but only the rules that the filter allows to fire will be fired. E.g., if you want to fire only the rules which have a name that start with "X", you can use the following line of code:

    ksession.fireAllRules( new RuleNameStartsWithAgendaFilter("x") );

    For more info, here is the interface:

    https://github.com/droolsjbpm/droolsjbpm-knowledge/blob/master/knowledge-api/src/main/java/org/drools/runtime/rule/AgendaFilter.java

    Here is the documentation (Scroll down to topic 3.3.3.4.1):

    http://docs.jboss.org/drools/release/5.4.0.Final/drools-expert-docs/html_single/index.html#d0e2792

Спасибо, на самом деле я попробовал второй способ, который вы предложили, как описано в этом сообщении в блоге:fusionspan.blogspot.com/2012/02/…, Он работал нормально, когда мои правила загружались из файловой системы, но не тогда, когда правило было развернуто в Guvnor. В этом случае у меня было исключение NPE: java.lang.NullPointerException по адресу org.drools.base.mvel.MVELCompilationUnit.createFactory (MVELCompilationUnit.java:262) по адресу org.drools.base.mvel.MVELCompilationUnit:omp.jj ( ) Frederic Close
Ошибка, созданная в трекере jboss:issues.jboss.org/browse/GUVNOR-1904 Frederic Close
Можете представить пример использования собственных аннотаций правила в функции enabled ()?
Я получил пример из источника Drools (test_enabledExpressions.drl):enabled ( rule.metaData["ruleID"] == "1234" )
Это ошибка. Он должен работать так же, независимо от того, откуда он загружен. Было бы здорово, если бы вы могли открыть заявку с вашей проблемой, чтобы ее можно было исправить.

Похожие вопросы