Как объявить нестатическую глобальную переменную в OptaPlanner

Во время решающей фразы OptaPlanner я хочу обновить глобальную переменную. Изменения глобальной переменной изменят мою следующую проверку правил.

Результат.java

package com.domain; 

public static boolean status;
...
...

Образец.drl

import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScoreHolder;       
import com.domain.Result;
global HardSoftScoreHolder scoreHolder; 

rule "Sample Rule"
when
 $PlanningEntity:PlanningEntity()
then
 somelogic($PlanningEntity);
 if(Result.status){
    scoreHolder.addHardConstraintMatch(kcontext, -500);
 }
end

function void somelogic(PlanningEntity planningEntity){
    if(condition 1...){
         Result.status = true;
    }else if(condition 2...){
         Result.status = false;
    }else{
         //Do Nothing
    }
}

Мой вопрос:

Как я могу объявить статическую глобальную переменную для сеанса решения. (Чтобы избежать одновременного использования решателя OptaPlanner несколькими пользователями.)


person Jeffrey Lai Guo Zin    schedule 06.04.2015    source источник


Ответы (1)


В настоящее время вы не можете надежно использовать глобальную переменную, потому что OptaPlanner может порождать несколько сеансов drools (необходимых для будущих функций, таких как многопоточное решение, эвристика на основе населения и т. д.).

Обходной путь прост: просто добавьте один факт о проблеме и используйте его. См. классы *Parametrization в примерах.

person Geoffrey De Smet    schedule 06.04.2015
comment
Но не будут ли все эти сеансы Drools частью сеанса одного пользователя (т. е. выполнения Java-приложения)? Следовательно, не будет перекрестного огня, которого, похоже, боится ОП. - Кстати, в справочном руководстве по Drools даже не говорится, что глобальные переменные являются общими для сеансов, запускаемых из одной и той же Java-программы (но почему-то я откуда-то это помню). - person laune; 06.04.2015
comment
Каждый сеанс drools, используемый внутри optaplanner, должен иметь свои собственные глобальные экземпляры (если только это не потокобезопасный регистратор (или что-то еще, что он действует только как приемник, а не как источник). Создание этих экземпляров должно происходить через обратный вызов , так как optaplanner может создавать любое количество сеансов drools, которое пожелает (хотя в настоящее время он создает только 1 сеанс в обычном режиме) - person Geoffrey De Smet; 06.04.2015
comment
Можно ли будет использовать теневые переменные или добавлять переменные в оперативную память в opta-planner (как в подсчете очков)? Мне нужен динамический проблемный факт, который может меняться и применяться к следующему правилу. Пример: 1-й шаг обновляет факт как A. 2-й шаг использует факт A в правиле и обновляет факт как B. 3-й шаг использует B в правиле и обновляет факт... - person Jeffrey Lai Guo Zin; 07.04.2015