Child workflows
workflow.ExecuteChildWorkflow
enables the scheduling of other workflows from within a workflow's
implementation. The parent workflow has the ability to monitor and impact the lifecycle of the child
workflow, similar to the way it does for an activity that it invoked.
cwo := workflow.ChildWorkflowOptions{
// Do not specify WorkflowID if you want Cadence to generate a unique ID for the child execution.
WorkflowID: "BID-SIMPLE-CHILD-WORKFLOW",
ExecutionStartToCloseTimeout: time.Minute * 30,
}
ctx = workflow.WithChildWorkflowOptions(ctx, cwo)
var result string
future := workflow.ExecuteChildWorkflow(ctx, SimpleChildWorkflow, value)
if err := future.Get(ctx, &result); err != nil {
workflow.GetLogger(ctx).Error("SimpleChildWorkflow failed.", zap.Error(err))
return err
}
Let's take a look at each component of this call.
Before calling workflow.ExecuteChildworkflow()
, you must configure ChildWorkflowOptions
for the
invocation. These options customize various execution timeouts, and are passed in by creating a child
context from the initial context and overwriting the desired values. The child context is then passed
into the workflow.ExecuteChildWorkflow()
call. If multiple child workflows are sharing the same option
values, then the same context instance can be used when calling workflow.ExecuteChildworkflow()
.
The first parameter in the call is the required cadence.Context
object. This type is a copy of
context.Context
with the Done()
method returning cadence.Channel
instead of the native Go chan
.
The second parameter is the function that we registered as a workflow function. This parameter can also be a string representing the fully qualified name of the workflow function. The benefit of this is that when you pass in the actual function object, the framework can validate workflow parameters.
The remaining parameters are passed to the workflow as part of the call. In our example, we have a
single parameter: value
. This list of parameters must match the list of parameters declared by
the workflow function.
The method call returns immediately and returns a cadence.Future
. This allows you to execute more
code without having to wait for the scheduled workflow to complete.
When you are ready to process the results of the workflow, call the Get()
method on the returned future
object. The parameters to this method is the ctx
object we passed to the
workflow.ExecuteChildWorkflow()
call and an output parameter that will receive the output of the
workflow. The type of the output parameter must match the type of the return value declared by the
workflow function. The Get()
method will block until the workflow completes and results are
available.
The workflow.ExecuteChildWorkflow()
function is similar to workflow.ExecuteActivity()
. All of the
patterns described for using workflow.ExecuteActivity()
apply to the workflow.ExecuteChildWorkflow()
function as well.
When a parent workflow is cancelled by the user, the child workflow can be cancelled or abandoned based on a configurable child policy.