Фон:
У меня есть три диаграммы bpmn
- DMTMain.bpmn
- DMTSub.bpmn
- DMTTst .bpmn
Для них это Сервисные Задачи - скриншоты
1. DMTMain.bpmn
![enter image description here](https://i.stack.imgur.com/KFwQs.png)
2. DMTSub.bpmn
![enter image description here](https://i.stack.imgur.com/XhEoW.png)
3. DMTTst.bpmn
![enter image description here](https://i.stack.imgur.com/Q109P.png)
Первый 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
- SubParse
- SubTst
- Exception в DMTTst.bpmn
- SubOut1
- SubParse
- SubTst
- Исключение в DMTTst.bpmn
- SubOut1
- SubParse
- SubTst
- Исключение в DMTTst.bpmn
- SubOut1
Ожидаемое поведение:
Если из DMTTst.bpmn возникла какая-либо ошибка, он должен иметь возможность поймать SubTst (или эквивалентное место) и перейти к SubOut2 и SubOut3, не переходя к началу
На самом деле я знаю, что мы также можем вызывать DMTTst.bpmn, используя CallActivity. Но мы перешли на это, поскольку хотим перехватывать исключения.
- SubParse
- SubTst
- Exception at DMTTst.bpmn
- SubOut1
- SubOut2
- 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, но безуспешно. Теперь пробуем варианты, указанные в , здесь