Skip to content

子流程

引擎支持在流程中发起另一个流程,即父子嵌套流程。

父流程(主流程)工作在到达子流程节点时,会根据配置调用子流程发起服务,开发人员可以根据需要决定如何创建子流程工作。子流程发起后,主流程会持续等待直到子流程执行完毕。 当所有子流程执行完毕后,引擎会尝试调用可选的子流程结束服务,满足个性化业务需要。

提示

引擎调用上述服务时会传入上下文参数,现在包含版本号参数,方便开发人员实现业务逻辑版本化。

发起

下面是一个子流程发起示例,发起服务必须实现SubProcInitializer接口。

java
@Component
public class SimSubProcessInit implements SubProcInitializer {
    @Override
    public void execute(WorkflowEngine engine, WorkflowStepContext context) {
        engine.create(new WorkAddDto("1014355886581219328", "发起了一个子流程", context.getTargetWorkflow(), context.getWorkId(), context.getWorkflowId(), context.getNodeCode()));
        engine.create(new WorkAddDto("1801164487030423557", "发起了一个子流程(2)", context.getTargetWorkflow(), context.getWorkId(), context.getWorkflowId(), context.getNodeCode()));
        // 如起填节点无需用户操作,可直接推进至下一节点
        // engine.step(new WorkStepNodeDto(workId, "start"));
    }
}

WorkflowStepContext

context 对象提供以下属性:

名称类型说明
workIdString工作编号
workflowIdString流程编号
bizIdString业务标识
versionNumber流程版本
nodeCodeString当前节点
targetWorkflowString子流程code
targetVersionNumber子流程版本
bizDataobject自定义对象

context 对象还提供了 toWorkAddDto 方法,使用它可以略微简化代码。

java
public void execute(WorkflowEngine engine, WorkflowStepContext context) {
  WorkAddDto dto = context.toWorkAddDto();
  dto.setBizId("1014355886581219328");
  dto.setTitle("发起了一个子流程");
  engine.create(dto);

  dto.setBizId("1801164487030423557");
  dto.setTitle("发起了一个子流程(2)");
  engine.create(dto);
}

结束

结束服务并不是必需的。如果使用结束服务,必须实现SubProcFinalizer接口。

java
@Component
public class SimSubProcessFinish implements SubProcFinalizer {
    @Autowired
    FooBiz fooBiz;

    @Override
    public void execute(WorkflowEngine engine, WorkflowFinishContext context) {
        fooBiz.go();
    }
}

WorkflowFinishContext

context 对象提供以下属性:

名称类型说明
workIdString工作编号
bizIdString业务标识
versionNumber流程版本
parentWorkIdString父流程工作编号
parentBizIdString父流程业务标识
parentVersionNumber父流程版本
parentNodeCodeString父流程节点
bizDataobject自定义对象

.NET 差异

.NET 中对应的接口分别为 IWorkflowSubProcInitializerIWorkflowSubProcFinalizer。实现类需要添加 DisplayName 特性声明服务名。

csharp
[DisplayName("testStartSubInitializer")]
[Service(typeof(IWorkflowSubProcInitializer))]
public class TestStartSubInitializer : IWorkflowSubProcInitializer
{
    public void Execute(IWorkflowEngine engine, WorkflowStartContext context)
    {
    }
}