一、背景
在0.21版本之前,Zeebe不支持多实例元素,在2019年10月9号发布的0.21版本中,加入这一特性,
主要是体现在Zeebe Modeler 0.7.0以及之后的版本中。
二、特性介绍
我对这个多实例比较好奇,研究了一下,它最终是解决了什么问题,在官方文档中介绍如下:
A multi-instance activity is executed multiple times - once for each element of a given collection (like a foreach loop in a programming language).
翻译一下:多实例流程会被执行多次——给定的集合中的每个元素都被执行一次(类似编程语言中的foreach循环)
对于这句话,我们可以理解成,你现在有个微服务接口是执行单个操作的,现在有个场景需要对它进行批量的操作,
而且批量执行之后或许需要用到返回值,那么我们可以使用这个特性。
三、Demo 演示
我在本机部署了Zeebe 0.21版本的服务,然后下载了Zeebe Modeler 0.7.0建模工具
1.建模
支持多实例特性就是在服务(支持ServiceTask、ReceiveTask。SubProcess)上加上三道横杠(或者竖着)


流程描述:外部传入参数data,这个参数结构如下:
public class Order
{
public string Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public string Id { get; set; }
public string OrderId { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public int Count { get; set; }
}
第一步先根据参数创建主单信息,第二步通过拿到主单Id去批量创建明细单的信息,最后一步是观察一下最终可以拿到什么返回值(观察Zeebe Variables的值)
2.执行代码
public static async Task Main(string[] args)
{
// create zeebe client
_client = ZeebeClient.NewZeebeClient(ZeebeUrl);
// deploy
var deployResponse = await _client.NewDeployCommand().AddResourceFile(DemoProcessPath).Send();
// create workflow instance
var workflowKey = deployResponse.Workflows[0].WorkflowKey;
// 发起调用
var workflowInstance = await _client
.NewCreateWorkflowInstanceCommand()
.WorkflowKey(workflowKey)
.Variables(JsonConvert.SerializeObject(WorkflowInstanceVariables))
.Send();
// 模拟JobWorkers监听
Initial();
}
其实结果是失败的,因为我们没有配置多实例的inputCollection,补充上这块的配置

配置完成后,再去执行,结果如下:

这是按照顺序执行的规则来的也就是,C#的foreach使用的方法,顺序执行每个元素。
在Zeebe Variables里面会有一个responses字段(这是我们定义的Output Collection),里面包含着这两次执行后的结果列表。
另外还有一种并行执行的,类似于C#中的Parallel.ForEach(),在此不作赘述。
四、总结
这个特性其实是Zeebe对于微服务接口的扩展,将执行单个的接口扩展成批量接口,执行逻辑上支持顺序执行与并发执行。
参考:
【1】https://docs.zeebe.io/bpmn-workflows/multi-instance/multi-instance.html
原文:https://www.cnblogs.com/walt/p/11731668.html