#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
этого, создав и вставив факт с уровнем журнала (и другими параметрами). Это имело бы дополнительные преимущества:
- Вы можете динамически изменять уровень журнала.
-
Вы можете заблокировать оценку правила на ранней стадии, если единственной целью правила является ведение журнала.
Parameters( logLevel != LogLevel.NONE ) MyFact()
Комментарии:
1. Насколько я понимаю, операторов eval следует избегать, если это вообще возможно, потому что они не кэшируются rete так эффективно, как при использовании факта. Действительно ли eval является лучшим вариантом в этой ситуации?
2. @melchoir55 Если вы хотите сделать ссылку на поле statc: да. Возможно, вы подумали о других вариантах — см. Мое второе дополнение.