В приложении, над которым я сейчас работаю, мне нужно периодически проверять право на получение десятков тысяч объектов для какой-либо службы. Сама диаграмма принятия решений имеет следующий вид: Деревья принятия решений и механизмы правил (Drools)
В каждом из конечных узлов (кругов) мне нужно запустить действие (изменить поле объекта, информацию журнала и т. Д.). Я попытался использовать Drool Expert framework, но в этом случае мне нужно написать длинное правило для каждого пути на диаграмме, ведущей к конечному узлу. Drools Flow, похоже, не создан для такого использования: я беру объект, а затем, в зависимости от решений на этом пути, я заканчиваю на одном из конечных узлов; а затем снова для другого объекта. Или это? Не могли бы вы привести несколько примеров/ссылок на такие решения?
UPDATE:
Drools потока вызовов может выглядеть следующим образом:
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();
for(int i = 0; i < 10000; i++) {
Application app = somehowGetAppById(i);
// insert app into working memory
FactHandle appHandle = ksession.insert(app);
// app variable for action nodes
params.put("app", app);
// start a new process instance
ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
while(true) {
if(instance.getState() == instance.STATE_COMPLETED) {
break;
}
}
// remove object from working memory
ksession.retract(appHandle);
}
То есть: я бы объект Application, начать новый процесс для него, когда процесс закончен (конечный, узел действия каким-то образом изменил бы приложение), я удалю объект из рабочей памяти и повторю процесс для нового объекта приложения. Что вы думаете об этом решении?
РЕШЕНИЕ:
Я закончил с использованием Drools Flow и она работает достаточно хорошо. Мой процесс решения не так прост, как Drools Expert запрашивает и в зависимости от того, где в дереве решений процесс должен загружать списки объектов из базы данных, преобразовывать их, принимать решения, записывать все и т. Д. Я использую объект Process который передается процессу в качестве параметра и хранит все мои глобальные переменные (для процесса) и некоторые методы удобства, которые повторяются в разных точках дерева (поскольку запись кода Java в узлах Script Task
не очень удобна). Я также использовал Java для принятия решений (а не mvel
или правил) - это быстрее, и я бы сказал, что легче контролировать. Все объекты, с которыми я работаю, передаются как параметры и используются в качестве обычных переменных Java в коде.
Кроме того, по мере роста вашего дерева решений вы можете обнаружить, что некоторые конечные узлы разделяют действия (например, все потребности Retiree в получении пенсии, не относящиеся к их полу), и неэффективно повторно объявлять это действие для каждого конечного узла. –
Как насчет Drools Flow? Я смогу смоделировать дерево решений, используя это, а затем я мог бы поместить один объект в рабочую память, запустить процесс и позволить ему решить, какой конечный узел взять, затем вынуть объект, вставить еще один, запустить его снова и так далее ? Разве это не более четкое решение? –
Drools Flow не имеет смысла. Не сказать, что это не сработает, но поскольку вы принимаете решение, таблица решений, реализованная с помощью механизма правил, выглядит намного логичнее/естественнее. Попытка вставить его в рабочий процесс является более сложной: рабочий процесс долговечен, каждый узел является состоянием. –