0

我希望从流口水的 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
4

1 回答 1

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,它仍然是一等公民。只有“内联”eval才不再有用。

** 之后 **

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

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

    Parameters( logLevel != LogLevel.NONE )
    MyFact()
    
于 2014-06-24T19:06:05.973 回答