Java 属性-规则drool文件中的drools.getRule().getName()

Java 属性-规则drool文件中的drools.getRule().getName(),java,jboss,drools,mvel,jboss-rules,Java,Jboss,Drools,Mvel,Jboss Rules,我需要根据后端数据启用/禁用drl文件中的某些规则。 i、 e针对迪拜启用规则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 )

我需要根据后端数据启用/禁用drl文件中的某些规则。 i、 e针对迪拜启用规则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

为什么不使用代理过滤器

非常容易使用,可以在Java部分中完成,如下所示:

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

myFilter = new RuleNameStartsWithAgendaFilter("SINGAPORE");
mySession.fireAllRules(filter);
代理过滤器有多种变体:

  • 开始
  • 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
位置是一个简单的bean。如图所示,阻塞规则可以访问“Match”对象,该对象(神奇地)允许您与元数据或规则名称进行匹配。当然,评估可能会访问位置中的某些方法,以便对规则名称进行更复杂的检查

请注意,您需要设置一个选项:

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

或者使用kmodule XML(请参阅文档)。

请格式化代码。根据规则名称创建应用程序逻辑非常脆弱。你真的应该在你的规则中建立这样的逻辑。这就是他们的目的!因此,我怀疑对这个具体问题的任何回答都不太可能是解决实际问题的好办法。请注意,似乎投票结束这个问题的人“不清楚你在问什么”。对于熟悉Drools的人来说,OP的要求是完全清楚的。我是否可以将Drools.getName().getRule()作为参数传递给java方法处理启用属性,如上面的代码所示。如果是,请帮忙。这就是我被困的地方。嘿,艾特尼尔,谢谢你的解决方案。70%接近我的要求。我需要将rule-name从enabled(checkenabled(drools.getRule().getName())传递给java文件。checkenabled是一个java函数,它根据作为参数传递给它的rulename来启用/禁用规则。但是当将drools.getRule().getName()作为参数传递给它时,它会给出上述错误。而在RHS中同样有效。