drools.getRule().getName() в атрибутах -rule файл drool

Мне нужно включить / отключить определенные правила из файла drl на основе данных из бэкэнда. т.е. включить правило 1,2,3 для Дубая, включить 1,3 для Сингапура Итак, я передаю drools.getRule().getName(), как показано ниже.

rule "Apply 50% discount to VIP customers"
    enabled (checkenabled(drools.getRule().getName()))
when
    $s : Sale( customer.type == CustomerType.VIP )  
then
$s.setDiscount(0.50);
    System.out.println("VIP discount applied1" + drools.getRule().getName());
end

Я получаю ниже ошибки по этому вопросу.

Exception in thread "main" [Error: null pointer: drools.rule.name]
[Near : {... checkenabled(drools.rule.name) ....}]
                          ^
[Line: 1, Column: 14]
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:427)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:140)
    at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
    at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
    at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:948)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:373)
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:140)
    at org.mvel2.ast.ASTNode.optimize(ASTNode.java:159)
    at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:115)
    at org.mvel2.MVELRuntime.execute(MVELRuntime.java:86)
    at org.mvel2.compiler.CompiledExpression.getDirectValue(CompiledExpression.java:123)
    at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:119)
    at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:113)
    at org.mvel2.MVEL.executeExpression(MVEL.java:930)
    at org.drools.core.base.mvel.MVELEnabledExpression.getValue(MVELEnabledExpression.java:92)
    at org.drools.core.definitions.rule.impl.RuleImpl.isEffective(RuleImpl.java:384)
    at org.drools.core.phreak.RuleExecutor.cancelAndContinue(RuleExecutor.java:326)
    at org.drools.core.phreak.RuleExecutor.fire(RuleExecutor.java:142)
    at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:94)
    at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:964)
    at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1234)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1239)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1212)
    at com.emirates.App.testGoodCustomer(App.java:95)
    at com.emirates.App.main(App.java:74)
Caused by: java.lang.NullPointerException
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:393)
    ... 25 more

2 ответа

Почему вы не используете AgendaFilter?

Довольно прост в использовании, может быть сделано в части Java следующим образом:

AgendaFilter myFilter = new RuleNameStartsWithAgendaFilter("DUBAI");
mySession.fireAllRules(filter);

myFilter = new RuleNameStartsWithAgendaFilter("SINGAPORE");
mySession.fireAllRules(filter);

Существует несколько вариантов AgendaFilter:

  • Начинается с
  • EndsWith
  • Содержит
  • Матчи

Не совсем то, что вам нужно, но это может быть подсказка;-)

Это выглядит как хороший пример для "декларативной повестки дня". Это основано на правилах, используемых для блокировки правил. Вот простой пример:

import org.kie.api.runtime.rule.Match;
rule "Apply 50% discount"
  @Eager                     // required for each rule to be blocked
  @Category("Singapore")
when
  $s : Sale( article matches ".*PX" ) // anything
then
  System.out.println("VIP: " + drools.getRule().getName());
end

rule "CheckBlock"
  @Direct @Eager // required for each rule that blocks
when
  Location( $country: country )
  // $m: Match( Category == "Singapore" )
  $m: Match( rule.name == "Apply 50% discount" )
then
  kcontext.blockMatch( $m );
end

Место это простой боб. Как показано, правило блокировки может получить доступ к объекту "Сопоставление", который (волшебным образом) позволяет сопоставлять метаданные или имя правила. Конечно, оценка может получить доступ к некоторому методу в Location для более сложных проверок имени правила.

Обратите внимание, что вам нужно установить опцию:

 KieBaseConfiguration config = ks.newKieBaseConfiguration();
 config.setOption( DeclarativeAgendaOption.ENABLED );

или используйте kmodule XML (см. документацию).

Другие вопросы по тегам