亚马逊简单的工作流程 - 并行处理任务,只有在前一阶段的所有并行流程完成后才能进入下一阶段

时间:2012-06-08 16:45:47

标签: java amazon-swf

我正在创建一个应用程序,其中有多个阶段 - 在第一阶段中有多个任务要并行执行...一旦该阶段的所有任务完成,只有处理才能进入下一个阶段阶段。

从我读到的关于决策者的内容来看,决策者可以从下一阶段的众多可能选项中选择一种。

但是,只有当前阶段的所有并行流程都已完成时,我才想进入下一阶段。

这是否意味着我应该设置每个并行进程来调用下一个阶段,并且当下一个阶段初始化时,它应该检查前一阶段的所有并行进程是否完成,然后才真正开始处理?这意味着第一阶段的所有并行进程都将调用对应。第二阶段的并行流程,其中只有一个实际上会进行处理(因为这将是发现前一阶段的所有流程都已完成的流程)。

有更好的方法来实现吗?那么下一阶段的过程只被召唤一次?

1 个答案:

答案 0 :(得分:5)

这可以使用flow framework中的活动返回的Promise对象来解决。

在你的决策代码中,有一个stage1函数,它将并行执行多个活动,每个活动返回一个Promise对象。在List<Promise<>>中添加所有这些promise对象,并将此List传递给处理第2阶段的异步方法。

这是一个示例决策代码。 stage1()并行执行三个活动并调用异步方法stage2(@Wait List<Promise<Void>> promiseList)。除非promiseList中的所有承诺都得到满足,即除非第1阶段的所有三项活动都已完成,否则不会启动stage2。

private void stage1() {
    List<Promise<Void>> promiseList = new ArrayList<Promise<Void>>();
    Promise<Void> promise1 = activityClient.activity1();
    Promise<Void> promise2 = activityClient.activity2();
    Promise<Void> promise3 = activityClient.activity3();

    promiseList.add(promise1);
    promiseList.add(promise2);
    promiseList.add(promise3);

    stage2(promiseList);
}

@Asynchronous
private void stage2(@Wait List<Promise<Void>> promiseList) {
    activityClient.activity4();
}
相关问题