首页 文章

Amazon SWF并行子工作流执行暂停父工作流

提问于
浏览
1

我试图开始两个并行执行具有不同启动参数的子工作流 . 但是,我注意到只运行了其中一个子工作流程执行 . 由于未调度任务导致父工作流执行停止,导致执行历史记录中没有任何进一步的活动,直到超时为止 . 没有抛出异常或错误,它只是停止做任何事情 . 有趣的是,它始终是完成的第二个子工作流程执行 .

如果父级只运行子工作流的一次执行,则子级成功完成,父级工作流继续完成 . 我怀疑它与同时运行子工作流的多个副本有关,并且由于他们轮询相同的任务列表而相互干扰;我只是不知道我应该如何处理这个问题 .

码:

ProcessRunnerClient childWorkflowClient = factory.getClient();
List<Promise<T>> childWorkflowsDone = new ArrayList<Promise<T>>;
switch(condition){
case 1:
    childWorkflowsDone.add(childWorkflowClient.method(case1Params));
// Works fine
    break;
case 2:
    childWorkflowsDone.add(childWorkflowClient.method(case2Params));
// Works fine
    break;
case 3:
    childWorkflowsDone.add(childWorkflowClient.method(case1Params));
    childWorkflowsDone.add(childWorkflowClient.method(case2Params));
// The execution of the child workflow with case2Params completes,
// and parent execution suspends
    break;
default:
    throw new WorkflowException("Condition " + condition + " not supported");
}

1 回答

  • 1

    确保使用自己生成的客户端实例启动每个子工作流 . 所以将你的例子改为:

    List<Promise<T>> childWorkflowsDone = new ArrayList<Promise<T>>;
    ProcessRunnerClient childWorkflowClient1 = factory.getClient()
    childWorkflowsDone1.add(childWorkflowClient.method(params1));
    ProcessRunnerClient childWorkflowClient2 = factory.getClient()
    childWorkflowsDone.add(childWorkflowClient2.method(params2));
    

    这样做是为了支持在子工作流启动后与子工作流的通信 . 例如,可以使用相同的客户端发送信号或检索runId .

相关问题