У вас там будут те же проблемы с дизайном. Переключение реализации механизма правил не поможет. 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.

Ответы на вопрос(2)

Ваш ответ на вопрос