Drools引用静态字段

时间:2014-06-24 18:42:04

标签: 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 file:

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

1 个答案:

答案 0 :(得分:1)

如果您的Java类a.b.Foo具有公共静态字段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,它仍然是一等公民。这是&#34;内联&#34;仅eval已经失去其实用性。

**后来**

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

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

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