Рабочие элементы JBPM в таблице управляемых решений выполняются только один раз? - PullRequest
0 голосов
/ 30 января 2019

Я проектирую таблицу управляемых решений для выполнения некоторых рабочих элементов, которые просто распечатывают некоторые тексты в функции executeWorkItem.

В настройках рабочей среды я добавил обработчики рабочих элементов в сеанс с состоянием.Также я определил их в файле виджета.

Правила в таблице управляемых решений довольно просты.В представлении исходного кода это выглядит следующим образом:

//from row number: 1
rule "Row 1 dt1"
    dialect "mvel"
    when
    then
        org.drools.core.process.instance.WorkItemManager wim = (org.drools.core.process.instance.WorkItemManager) drools.getWorkingMemory().getWorkItemManager();
        org.drools.core.process.instance.impl.WorkItemImpl wiQianhaiAddrWorkItemHandler = new org.drools.core.process.instance.impl.WorkItemImpl();
        wiQianhaiAddrWorkItemHandler.setName( "QianhaiAddrWorkItemHandler" );
        wim.internalExecuteWorkItem( wiQianhaiAddrWorkItemHandler );
end

Нет условной проверки только потому, что я хочу запускать ее каждый раз, когда на сервер KIE отправляется запрос.

Этот запрос отправляется наСервер KIE

URL:http://localhost:8080/kie-server/services/rest/server/containers/instances/poc2_1.0.1
body:
{"commands": [
  {
    "fire-all-rules": {}
  }
]}

Я вижу, что рабочий элемент был выполнен при первом запуске запроса на сервере KIE.Тем не менее, он больше не запускается со второго раза, потому что я не вижу никакой печати в консоли.

Ответ от сервера KIE всегда корректен, как указано ниже

{
  "type" : "SUCCESS",
  "msg" : "Container poc2_1.0.1 successfully called.",
  "result" : {
    "execution-results" : {
      "results" : [ ],
      "facts" : [ ]
    }
  }
}

Могу ли язнаете, как выполнить рабочий элемент в соответствии с моей отправленной командой "fire-all-rules"?Или это поведение по умолчанию в JBPM?

1 Ответ

0 голосов
/ 30 января 2019

Давайте начнем с того, что даже если вы используете WorkItemManager, ваша проблема полностью связана с Drools.

В Drools правило без условий будет выполняться только один раз за сеанс в первый разВы или кто-то звоните fireAllRules().В вашем случае, поскольку ваши запросы используют один и тот же сеанс с сохранением состояния, ваше правило будет выполнено один раз.

Первый подход заключается в использовании сеанса без сохранения состояния, если это возможно.Если это невозможно, вам может потребоваться явно указать Drools, когда обрабатывается новый запрос, отправив факт вместе с запросом и добавив его в условие вашего правила.Позже вы можете удалить эти факты, если они вам не нужны в вашей сессии:

rule "Row 1 dt1"
dialect "mvel"
when
    Request()
then
    org.drools.core.process.instance.WorkItemManager wim = (org.drools.core.process.instance.WorkItemManager) drools.getWorkingMemory().getWorkItemManager();
    org.drools.core.process.instance.impl.WorkItemImpl wiQianhaiAddrWorkItemHandler = new org.drools.core.process.instance.impl.WorkItemImpl();
    wiQianhaiAddrWorkItemHandler.setName( "QianhaiAddrWorkItemHandler" );
    wim.internalExecuteWorkItem( wiQianhaiAddrWorkItemHandler );
end


rule "Cleanup Request"
salience -10
when
    $r: Request()
then
    delete($r);
end

Надеюсь, это поможет,

...