可能的错误:
当子B失败时,GenericWorkflowClientImpl中的handleStartChildWorkflowExecutionFailed方法被删除" OpenRequestInfo"来自scheduledExternalWorkflows地图,基于工作流ID作为关键字。由于5个子工作流具有相同的工作流ID。因此,一旦子B初始化失败,映射就变为空。因此,父工作流无法完成,因为4个子工作流请求永远无法在handle *方法中正确关闭。
第335行显示handleStartChildWorkflowExecutionFailed删除失败的条目。
答案 0 :(得分:1)
Update2 :问题仍然没有解决:(。
更新:可能是提交0a183e02b29b06e9324b740af40daff9193c9290修复了该错误。请验证。
它看起来像DecisionsHelper中的错误。它假定DecisionId永远不会被重用,因为它永远不会从决策地图中删除。 DecisionId永远不会重复用于活动和lambdas,但正如您所发现的那样,对于子工作流程并不总是如此:(。解决方法是不重用子工作流ID。
在您的情况下,我没有看到尝试安排具有相同ID的子工作流的原因,因为父工作流具有关于子工作流状态的完整信息,并且可以轻松避免它。 BTW您是否考虑过将CronInvocationSchedule与CronWithRety示例中的AsyncScheduledExecutor一起使用?
但是,如果父工作流的多个实例可以创建具有相同ID的子工作流,则此错误很糟糕。
答案 1 :(得分:0)
@Override
protected ExternalTaskCancellationHandler doExecute(final ExternalTaskCompletionHandle handle) throws Throwable {
context.setCompletionHandle(handle);
String workflowId = attributes.getWorkflowId();
if (scheduledExternalWorkflows.containsKey(workflowId)) {
WorkflowExecution workflowExecution = new WorkflowExecution();
workflowExecution.setWorkflowId(workflowId);
WorkflowType workflowType = attributes.getWorkflowType();
long fakeEventId = -1;
handle.fail(new StartChildWorkflowFailedException(fakeEventId, workflowExecution, workflowType, StartChildWorkflowExecutionFailedCause.WORKFLOW_ALREADY_RUNNING.toString()) );
return new ChildWorkflowCancellationHandler(workflowId, handle);
}
decisions.startChildWorkflowExecution(attributes);
scheduledExternalWorkflows.put(workflowId, context);
return new ChildWorkflowCancellationHandler(workflowId, handle);
}
}
}
更新了此课程中的第162行: