У вас там будут те же проблемы с дизайном. Переключение реализации механизма правил не поможет. Drools реализует JSR-94, но API JSR-94 слишком ограничен для большинства реальных случаев использования. Он не развивался годами.
ложении, над которым я сейчас работаю, мне нужно периодически проверять соответствие десятков тысяч объектов какой-либо услуге. Сама схема принятия решений имеет следующий вид, но она намного больше:
В каждом из конечных узлов (кругов) мне нужно выполнить действие (изменить поле объекта, информацию журнала и т. Д.). Я попытался использовать среду Drool Expert, но в этом случае мне нужно было написать длинное правило для каждого пути на диаграмме, ведущей к конечному узлу. Drools Flow, похоже, тоже не построен для такого варианта использования - я беру объект, а затем, в зависимости от решений на этом пути, оказываюсь в одном из конечных узлов; а затем снова для другого объекта. Либо это? Не могли бы вы дать мне несколько примеров / ссылок на такие решения?
ОБНОВИТЬ:
Вызовы Drools Flow могут выглядеть так:
// 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.