Рабочий процесс Camunda, запущенный из событий сообщений, повторяется трижды в случае исключения - PullRequest
2 голосов
/ 09 мая 2020

Фон:

У меня есть три диаграммы bpmn

  1. DMTMain.bpmn
  2. DMTSub.bpmn
  3. DMTTst .bpmn

Для них это Сервисные Задачи - скриншоты

1. DMTMain.bpmn

enter image description here

2. DMTSub.bpmn

enter image description here

3. DMTTst.bpmn

enter image description here

Первый DMTMain.bpmn вызывается с использованием реализации, упомянутой ниже Код # 1 .

Для этого также передается processId DMTMain.bpmn.

Затем в служебной задаче MainMsg из DMTMain.bpmn мы вызываем DMTSub.bpmn с использованием метода startProcessInstanceByMessage () , как указано ниже Code # 2 . (Обратите внимание, что DMTSub.bpmn запускается как MessageEvent).

Итак, процесс, запускаемый в DMTSub.bpmn, выполняется асинхронно, как мы и ожидали. (Вот почему мы использовали MessageStartEvent для DMTSub.bpmn)


Проблема:

В нашей ситуации могут быть различные ошибки, возникающие из DMTTst.bpmn процесс, включая ошибки, связанные с Camunda Engine.

  • например: Неизвестное свойство, используемое в выражении: $ {TstRunX}. Причина: не удается разрешить идентификатор 'TstRunX'

Это ожидаемое поведение , поскольку мы работаем над инфраструктурой вызывающего абонента (например, включая DMTMain и DMTSub et c).

Итак, проблема в том, что когда DMTTst.bpmn выдает подобные ошибки, хотя они обнаруживаются в SubTst, только служебная задача SubOut1 в DMTSub.bpmn выполняется после SubTst, и возвращается до начала (SubParse) ошибок печати DMTSub.bpmn, упомянутых в Error # 1 , без выполнения SubOut2 и SubOut3 .

Это повторяется точно три раза . Это должно быть из-за этого и может быть изменено повторной попыткой с помощью this

  1. SubParse
  2. SubTst
  3. Exception в DMTTst.bpmn
  4. SubOut1
  5. SubParse
  6. SubTst
  7. Исключение в DMTTst.bpmn
  8. SubOut1
  9. SubParse
  10. SubTst
  11. Исключение в DMTTst.bpmn
  12. SubOut1

Ожидаемое поведение:

Если из DMTTst.bpmn возникла какая-либо ошибка, он должен иметь возможность поймать SubTst (или эквивалентное место) и перейти к SubOut2 и SubOut3, не переходя к началу

На самом деле я знаю, что мы также можем вызывать DMTTst.bpmn, используя CallActivity. Но мы перешли на это, поскольку хотим перехватывать исключения.

  1. SubParse
  2. SubTst
  3. Exception at DMTTst.bpmn
  4. SubOut1
  5. SubOut2
  6. SubOut3

Код # 1

ProcessEngine defaultProcessEngine = BpmPlatform.getProcessEngineService().getDefaultProcessEngine();
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
ProcessInstanceWithVariables processInstanceWithVariables = null;

try {

     processInstanceWithVariables = runtimeService
                .createProcessInstanceByKey(processId)
                .setVariables(execution.getVariables())
                .executeWithVariablesInReturn();

        VariableMap variableMap = processInstanceWithVariables.getVariables();


} catch (Exception e) {
    e.printStackTrace();
}

Код # 2

public void execute(DelegateExecution execution) throws Exception {

    try {

        RuntimeService runtimeService = execution.getProcessEngineServices().getRuntimeService();
        runtimeService.startProcessInstanceByMessage("dmtSub", execution.getVariables());

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Ошибка №1:

15: 09: 15,996 ПРЕДУПРЕЖДЕНИЕ [org.camunda.bpm.engine.jobexecutor] ENGINE-14006 Исключение при выполнении задания f1377b93-91d8-11ea-b41b-0242c2113c7d:: org.camunda.bpm.engine.ProcessEngineException: исключение сохраняемости обработчика процесса в org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.rethrow * (Command .InvocationContext.rethrow * : 151) на org.camunda.bpm.engine.impl.interceptor.CommandContext.close (CommandContext. java: 178) на org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute (CommandContextInterceptor. java : 116) в org.camunda.bpm.engine.impl.interceptor.JtaTransactionInterceptor.execute (JtaTransactionInterceptor. java : 61) на org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute (ProcessApplicationContextInterceptor. java: 70) на org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute (LogInterceptor. * 1189 : 33) на org.camunda.bpm. engine.impl.jobexecutor.ExecuteJobHelper.executeJob (ExecuteJobHelper. java: 51) ....
....
Вызвано: java. sql .SQLException: IJ031070: Транзакция не может продолжаться : STATUS_MARKED_ROLLBACK в org.jboss.jca.adapters.jdb c .WrapperDataSource.checkTransactionActive (WrapperDataSource. java: 248) в org.jboss.jca.adapters.jdb c .Wrapped *: 1933) в org.jboss.jca.adapters.jdb c .WrappedConnection.checkStatus (WrappedConnection. java: 1948) в org.jboss.jca.adapters.jdb c .WrappedConnection.checkTransaction (WrappedConnection. java: 1922) в org.jboss.jca.adapters.jdb c .WrappedConnection.prepareStatement (WrappedConnection. java: 452)


Изменить:

Заметил, что это происходит, даже если мы вызываем DMTSub.bpmn через CallActivity или MessageEndEvent через обычную служебную задачу.

И мы пробовали разные способы, например, запустить рабочий процесс DMTTst с другим механизмом процесса, поймать th Исключение возникло в SubTst в событии Error End в рабочем процессе DMTSub, но безуспешно. Теперь пробуем варианты, указанные в , здесь

1 Ответ

1 голос
/ 11 мая 2020

Найдено несколько подходов, которые близки к ожидаемому решению.

Управление повторной попыткой :

Вы можете управлять повторной попыткой, поместив свойство failedJobRetryTimeCycle в свой standalone.xml файл, как указано ниже.

Шаблон, соответствующий стандарту ISO_8601 для повторяющихся временных интервалов .

<property name="failedJobRetryTimeCycle">R0/PT5S</property>

Или вы можете указать это в самом событии задачи / запуска службы с помощью Retry Time Цикл в конфигурации задания

enter image description here


Ошибка обнаружения и продолжение :

Это можно сделать в двумя способами.

  1. Добавление Boun dry Error Event ко всему рабочему процессу DMTTst . enter image description here

  2. Вызовите DMTTst как CallActivity и добавьте событие ошибки Boun dry к этому и дайте ему пройти через следующая задача

enter image description here

Примечание: Но в обоих случаях лучше добавить Код ошибки как java .lang.Exception, как указано ниже. Затем он перехватит любое исключение, являющееся его подклассом. например: Java исключение, нераспознанное свойство BPMN и др. c.

enter image description here

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...