Drools ссылается на статическое поле

#java #static #drools #mvel

#java #статическое #drools #mvel

Вопрос:

Я хочу сделать ссылку на статическое поле, присутствующее в классе java, из предложения when в drool. Я не хочу вставлять факт, представляющий это значение, потому что значение связано с нашей системой, а не с нашей бизнес-логикой. В частности, это для целей ведения журнала.

Приведенная ниже ссылка, по-видимому, предполагает, что ссылка на статическую переменную из файла drl возможна. Очевидно, что это будет работать из предложения then . Возможно ли также ссылаться на это значение в предложении when? Имейте в виду, что я предпочитаю не использовать операторы eval, поскольку я понимаю, что они являются инструментом последней инстанции.

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

Обновить:

Ниже приведен код, в который мне нужно вставить статический вызов. По сути, drool должен срабатывать только в том случае, если уровень журнала имеет определенное значение.

Класс 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
  

Комментарии:

1. Кто сказал, что «eval» устарел? Правда в том, что последние версии Drools не требуют, чтобы вы использовали eval в шаблоне, поскольку теперь возможны общие логические выражения.

2. Встроенные оценки явно не рекомендуются в документах. docs.jboss.org/drools/release/5.2.0.Final/drools-expert-docs/… Возможно, я просто мысленно устарел от других операторов eval, чтобы убедиться, что я никогда их не использовал.

Ответ №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()
      

Комментарии:

1. Насколько я понимаю, операторов eval следует избегать, если это вообще возможно, потому что они не кэшируются rete так эффективно, как при использовании факта. Действительно ли eval является лучшим вариантом в этой ситуации?

2. @melchoir55 Если вы хотите сделать ссылку на поле statc: да. Возможно, вы подумали о других вариантах — см. Мое второе дополнение.