Flow

时间:2016-04-09 13:40:11

标签: amazon-web-services workflow aws-sdk amazon-swf

  

可能的错误:

当子B失败时,GenericWorkflowClientImpl中的handleStartChildWorkflowExecutionFailed方法被删除" OpenRequestInfo"来自scheduledExternalWorkflows地图,基于工作流ID作为关键字。由于5个子工作流具有相同的工作流ID。因此,一旦子B初始化失败,映射就变为空。因此,父工作流无法完成,因为4个子工作流请求永远无法在handle *方法中正确关闭。

第335行显示handleStartChildWorkflowExecutionFailed删除失败的条目。

https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-swf-libraries/src/main/java/com/amazonaws/services/simpleworkflow/flow/worker/GenericWorkflowClientImpl.java#L335

2 个答案:

答案 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行:

https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-swf-libraries/src/main/java/com/amazonaws/services/simpleworkflow/flow/worker/GenericWorkflowClientImpl.java#L163