java - Drools 引用静态场

标签 java static drools mvel

我希望从 drool 的 when 子句中引用 java 类中存在的静态字段。我不想插入代表该值的事实,因为该值与我们的系统相关,而不是与我们的业务逻辑相关。具体来说,它用于记录目的。

下面的链接似乎表明可以从 drl 文件中引用静态变量。显然,这将从 then 子句开始起作用。是否也可以在 when 子句中引用该值?请记住,我不喜欢使用 eval 语句,因为我知道它们是最后的工具。

http://drools.46999.n3.nabble.com/Access-a-static-variable-from-Java-file-to-DRL-File-td4023641.html

更新:

下面是我需要将静态调用放入其中的代码。基本上,只有当日志级别达到一定值时,流口水才会触发。

Java 类:

public class LoggingUtilities{
public static LogLevel logLevel = LogLevel.NONE;
}

drl 文件:

import com.myproject.LoggingUtilities;
rule "MyRule"
when
  MyFact()
then
    Log.writeOut("Some Stuff");
end

最佳答案

如果您的 Java 类 a.b.Foo 有一个公共(public)静态字段 bar,您应该

import a.b.Foo;

然后你只需使用

when
   SomeFact( ... Foo.bar ... )

在某些约束表达式的上下文中。

如果您遇到问题,请提供该规则的完整 DRL 代码以及该 Java 类的最小代码片段。

稍后

根据您的示例:

import com.myproject.LoggingUtilities;

rule "MyRule"
when
   MyFact()
   eval( LoggingUtilities.logLevel != LogLevel.NONE )
then
    Log.writeOut("Some Stuff");
end

这是条件元素 (!) eval,它仍然是一等公民。只有“内联”eval 已经不再有用了。

** 稍后 **

您可以通过创建并插入带有日志级别(和其他参数)的事实来避免eval。这将有额外的优势:

  1. 您可以动态更改日志级别。
  2. 如果规则的唯一目的是记录,您可以尽早阻止规则评估。

    Parameters( logLevel != LogLevel.NONE )
    MyFact()
    

关于java - Drools 引用静态场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393985/

相关文章:

java - 测试静态方法类必须更改为单例以进行 JUnit 测试

java - 这段代码示例中 static 有什么用?

java - 在 Java 代码中访问 Drools 返回的事实对象

java - JBoss Drools 真的并行执行所有规则吗?

java - 如何重写父类的方法但允许可选参数?

java - 在Hadoop上实现Apriori算法

java - xtext:检测鼠标悬停在编辑器中的标记上时

java - 用字母表中的下一个辅音替换字符串中的辅音

c# - 访问静态代码块内的 "this"

Drools 7.4.1 kieservices.factory.get() 返回 null