Установка глобальных переменных в рабочей памяти в планировщике Drools - PullRequest
0 голосов
/ 28 июля 2011

Как добавить глобальную переменную в рабочую память в решателе планировщика drools, чтобы можно было использовать ее в счетах drool. Это похоже на https://issues.jboss.org/browse/JBRULES-2700, но не смог найти решение.

Ответы [ 3 ]

1 голос
/ 19 марта 2012

После установки задачи планирования:

solver.setPlanningProblem(planningProblem);

Вы можете получить доступ к рабочей памяти через SolutionDirector (HACK):

DefaultSolutionDirector solutionDirector = ((DefaultSolver)solver).getSolverScope().getSolutionDirector();
solutionDirector.getWorkingMemory().setGlobal("list", new ArrayList<String>());

Ура!

1 голос
/ 29 июля 2011

Сначала небольшая проповедь: использование службы (заданной как глобальная) для вычисления части оценки нарушит вычисление оценки на основе дельты (см. Раздел руководства по этой теме), что приведет к гораздо меньшим вычислениям оценкив секунду (скажем, 50 вместо 5000 в секунду для больших наборов данных).

Затем решение HACK: в StartingSolutionInitializer (вскоре известный как CustomSolverPhaseCommand) выполните solverScope.getWorkingMemory().setGlobal("key", value).

Затем реальное, долгосрочное решение: не могли бы вы объяснить, почему вы должны быть в состоянии сделать это?Мы можем подумать о добавлении поддержки для этого с чем-то вроде необязательного WorkingMemoryPreperator.

0 голосов
/ 09 июля 2014

Если вам нужно использовать некоторые вспомогательные методы в правилах планировщика, попробуйте следующий подход, который я использовал в своем проекте:

  1. Создайте служебный класс, который включает вспомогательные методы.
  2. Импортировать служебный класс в файл правил, как импортировать его в java-класс.
  3. Используйте вспомогательный метод в правиле. Если вы хотите использовать вспомогательный метод в условии, оберните его с помощью eval (). Если вы хотите использовать вспомогательный метод в части then, просто используйте его как обычный вызов метода Java.

Например, скажем, у вас есть служебный класс с именем PlanningUtil, как показано ниже:

public class PlanningUtil {
  public boolean isGood() {return true;}

  public void doSomething() {//...}
}

Затем импортируйте класс утилиты в файл правил,

import PlanningUtil;

Используйте служебный метод в правиле

rule "MyRule"
  when
    eval(PlanningUtil.isGood())
  then
    PlanningUtil.doSomething(); // note the ';' is a must. 
end
...