zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    佳佳的 Fibonacci
    毒瘤之神的考验
    An error occurred while searching for implementations of method
    eclipse 开发 scala
    hbase的数据模型
    Hbase和RDBMS(关系数据库管理系统)区别
    hbase和mapreduce开发 WordCount
    使用eclipse开发hbase程序
    hbase 的体系结构
    hbase 遇到过的问题
  • 原文地址:https://www.cnblogs.com/walt/p/11731668.html
Copyright © 2011-2022 走看看