Zeebe服务学习5-多实例特性实践

一、背景

在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

猜你喜欢

转载自www.cnblogs.com/walt/p/11731668.html
今日推荐