Java 从消息事件启动的Camunda工作流在出现异常时重复三次
背景: 我有三个bpmn图Java 从消息事件启动的Camunda工作流在出现异常时重复三次,java,asynchronous,exception,bpmn,camunda,Java,Asynchronous,Exception,Bpmn,Camunda,背景: 我有三个bpmn图 DMTMain.bpmn DMTSub.bpmn DMTTst.bpmn 以下是他们的服务任务-屏幕截图 1。DMTMain.bpmn 2。DMTSub.bpmn 3。DMTTst.bpmn 第一个DMTMain.bpmn是使用下面代码1中提到的实现调用的 为此,还传递了DMTMain.bpmn的processId 然后在DMTMain.bpmn的MainMsg服务任务中,我们使用startProcessInstanceByMessage()方法调用DMTSub
问题: 在我们的情况下,DMTTst.bpmn过程可能会抛出各种错误,包括与Camunda引擎相关的错误
- 例如:表达式${TstRunX}中使用了未知属性。原因:无法解析标识符“TstRunX”
预期行为: 如果从DMTTst.bpmn抛出任何错误,它应该能够在subst(或相等位置)捕获,并继续到SubOut2和SubOut3,而不去开始处 实际上,我知道我们也可以使用CallActivity调用DMTTst.bpmn。但是我们改变了这一点,因为我们想要捕捉异常
代码#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:15996警告[org.camunda.bpm.engine.jobexecutor]引擎-14006
执行作业f1377b93-91d8-11ea-b41b-0242c2113c7d时出现异常:
org.camunda.bpm.engine.ProcessEngineeException:流程引擎
持续性异常在
org.camunda.bpm.engine.impl.interceptor.CommandInvocationContext.rethrow(CommandInvocationContext.java: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.java:33)
在
org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobHelper.executeJob(ExecuteJobHelper.java:51)
....
原因:java.sql.SQLException:IJ031070:事务 无法继续:状态\u标记为\u回滚在 org.jboss.jca.adapters.jdbc.WrapperDataSource.checkTransactionActive(WrapperDataSource.java:248) 在 org.jboss.jca.adapters.jdbc.WrappedConnection.checkTransactionActive(WrappedConnection.java:1933) 在 org.jboss.jca.adapters.jdbc.WrappedConnection.checkStatus(WrappedConnection.java:1948) 在 org.jboss.jca.adapters.jdbc.WrappedConnection.checkTransaction(WrappedConnection.java:1922) 在 org.jboss.jca.adapters.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:452)
编辑: 注意,即使我们通过CallActivity或MessageEndEvent通过正常服务任务调用DMTSub.bpmn,也会发生这种情况
我们也尝试过不同的方法,比如用另一个流程引擎启动DMTTst工作流,在DMTSub工作流的错误结束事件中捕获SubST中抛出的异常,但没有成功。现在尝试一下中提到的选项,发现了两种接近预期解决方案的方法 控制重试: 您可以通过将
failedJobRetryTimeCycle
属性放入standalone.xml
文件来控制重试,如下所述
与数据相关的模式
R0/PT5S
或者,您可以使用作业配置下的重试时间周期在服务任务/启动事件本身中指定
捕捉错误和延续: 这可以通过两种方式实现
<property name="failedJobRetryTimeCycle">R0/PT5S</property>