子流程
引擎支持在流程中发起另一个流程,即父子嵌套流程。
父流程(主流程)工作在到达子流程节点时,会根据配置调用子流程发起服务
,开发人员可以根据需要决定如何创建子流程工作。子流程发起后,主流程会持续等待直到子流程执行完毕。 当所有子流程执行完毕后,引擎会尝试调用可选的子流程结束服务
,满足个性化业务需要。
提示
引擎调用上述服务时会传入上下文参数,现在包含版本号参数,方便开发人员实现业务逻辑版本化。
发起
下面是一个子流程发起示例,发起服务必须实现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 对象提供以下属性:
名称 | 类型 | 说明 |
---|---|---|
workId | String | 工作编号 |
workflowId | String | 流程编号 |
bizId | String | 业务标识 |
version | Number | 流程版本 |
nodeCode | String | 当前节点 |
targetWorkflow | String | 子流程code |
targetVersion | Number | 子流程版本 |
bizData | object | 自定义对象 |
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 对象提供以下属性:
名称 | 类型 | 说明 |
---|---|---|
workId | String | 工作编号 |
bizId | String | 业务标识 |
version | Number | 流程版本 |
parentWorkId | String | 父流程工作编号 |
parentBizId | String | 父流程业务标识 |
parentVersion | Number | 父流程版本 |
parentNodeCode | String | 父流程节点 |
bizData | object | 自定义对象 |
.NET 差异
.NET 中对应的接口分别为 IWorkflowSubProcInitializer
、IWorkflowSubProcFinalizer
。实现类需要添加 DisplayName
特性声明服务名。
csharp
[DisplayName("testStartSubInitializer")]
[Service(typeof(IWorkflowSubProcInitializer))]
public class TestStartSubInitializer : IWorkflowSubProcInitializer
{
public void Execute(IWorkflowEngine engine, WorkflowStartContext context)
{
}
}