父项完成后,子工作流程是否会继续运行? (ChildPolicy.ABANDON)

时间:2015-10-01 11:33:11

标签: java amazon-web-services workflow amazon-swf

我想从一个工作流程(父级)触发子工作流程。基本上这会发生在决策器的循环中

@Workflow
@WorkflowRegistrationOptions(defaultExecutionStartToCloseTimeoutSeconds = 240,
              defaultTaskStartToCloseTimeoutSeconds = 60)
public interface W1{
    @Execute(version = "1.0")
    void fn();
}

public class W1Impl implements W1{
    ChildClientFactory factory = new ChildClientFactoryImpl();

    @Override
    public void fn() {
       int i;
      /*
          I'll call activity1 that returns me a list(size = n)
          I trigger n child worflows(Each takes the content in the list and operates)
      */
       for(i = 0; i < n; i++) {
          ChildClient childWorkflowClient = factory.getClient();
          childWorkflowClient.someMethod(params);//TRIGGERING CHILD WORKFLOW
      }
    }
}

父工作流无需等待子工作流完成。即)子工作流将根据对它们的输入进行一些处理,并将结果放在持久性存储中。 所以我没有从子工作流程返回promise

注意:子工作流程的决策者返回类型为void

ChildPolicy上的WorkflowRegistrationOptions选项有ABANDON

选项

来自文档:

  

ABANDON:亚马逊SWF将不采取任何行动;孩子的处决将继续有效。

问题:

  1. 当我没有从子工作流程中返回任何承诺时,父工作流程会在触发所有子工作流程后完成吗?
  2. 即触发n子工作流后,父必须完成执行。孩子将继续跑步。 (因为我已指定ChildPolicy.ABANDON)。这是对的吗?

    1. 父级的defaultExecutionStartToClosetimeoutSeconds无需考虑(包括)子工作流程的超时,对吗?
    2. 3.是否对触发子工作流程的速率有任何限制? (因为我从循环中触发工作流程)

      还有什么我需要照顾的吗?

      谢谢..

3 个答案:

答案 0 :(得分:1)

1)nope(更新)。请参阅下面的马克西姆答案 2)如果您放弃它们,子工作流程的超时很重要。您唯一需要担心的事情(就超时而言)是父工作流程在有机会启动所有子工作流程之前会超时。
3)如果你在很短的时间内拨打了大量的电话(我已经看到它发生了),SWF可能会限制你,但是医生不清楚什么是大手段和什么时间段。请参阅:http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html

答案 1 :(得分:1)

我认为它不会完成。当包括活动和子工作流的所有任务完成或失败时,父工作流退出。内部工作流在TryCatchFinally内调用,仅在执行 doFinally 时完成。它不依赖于子工作流返回任何结果及其子策略。即使它返回void,生成的工作流客户端仍然会返回 Promise&lt; Void&gt; 并忽略此承诺不会改变行为。添加 workflowClient.detach 方法以断开父级与子级的连接应该非常简单。它将完成ExternalTask that controls the child workflow completion

恕我直言,我不打算分离客户端,因为在这种情况下,任何来自它们的错误都将被忽略。如果孩子因任何原因失败,保持他们的联系可确保父母获得例外。

就出发率而言,我不会非常担心。更重要的限制是单亲家长可以拥有的子女数量。由于需要返回包含太多孩子的每个决定的整个工作流程历史不是一个好主意。我不推荐超过100个。如果您需要更多,请创建一个工作流树。父母有100个孩子,每个孩子都有100个孩子,可以生育10个孩子。

使用生成的外部客户端从活动启动独立工作流是一种可能的解决方法。只需确保正确处理由于通信错误导致的工作流启动和活动失败等可能的故障情况。使用ActivityExecutionContext访问对SWF端点的引用和其他相关信息。

答案 2 :(得分:0)

您似乎对启动外部工作流而不是子工作流感兴趣。最佳做法是从父工作流中的活动启动工作流。这样就没有创建层次结构。 此外,当从决策工作者开始工作流程和活动时,速率得到控制(从我记得每秒10个活动和4个子工作流程,可以通过与swf团队交谈来增加)。允许一些峰值,但如果速率没有下降,那么你将开始获得rateexceededexception(不是吞吐量或节流)。 但是,如果从一个活动开始,那么就不会出现这样的问题,而这个活动就等同于启动新的工作流程。