书名:深入Flowable流程引擎:核心原理与高阶实战
ISBN:978-7-115-64900-3
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 贺 波 刘晓鹏 胡海琴
责任编辑 郭泳泽
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
本书旨在为读者提供关于Flowable的全面指南,深入探讨基于业务流程开发的思想和方法。全书分为4篇:基础准备篇介绍Flowable的基础用法、流程设计器集成与使用、工作流引擎配置、数据库设计、核心概念和API等,让读者建立对Flowable的基本认识;常规应用篇介绍Flowable各种功能和特性的配置与使用,让读者掌握Flowable的基础用法;高级实战篇立足实战,介绍如何基于Flowable的扩展特性实现对多种复杂流程场景的支持;架构扩展篇主要介绍提高Flowable性能和增大其容量的措施,并提出一套多引擎架构方案来支撑大容量、高并发和高稳定流程场景。
本书适合从事业务流程管理的开发人员、业务分析师、项目经理、企业管理者阅读。
基于个人经验,我可以肯定地说,对于任何技术作家,写一本书都是一项伟大的成就,而贺波在完成关于Activiti的一书之后,又写一本关于Flowable的新书,这确实令人惊叹。
作为Flowable项目及之前的Activiti项目的负责人,看到这本写得很好的聚焦技术的书得以出版,我感到非常高兴。贺波不遗余力地用大量的示例描述了BPMN/工作流引擎,以及将Flowable与其他框架集成的可能方式。本书提供的丰富内容将帮助任何对开源BPM感兴趣的人成功学习Flowable。
注意,Flowable还提供了CMMN和事件注册表引擎,这些在本书中没有描述,将在贺波的下一本书或其他材料中介绍,因此在您通过本书学习了BPMN引擎之后,还有更多的材料值得期待和探索。
我强烈推荐本书给Flowable的初学者,以及已经在使用Flowable并希望了解更多的开发者。
Flowable项目创始人 泰斯·拉德梅克
2024年3月11日
Out of personal experience I can say that writing a book is a great accomplishment for any technical writer, and it’s amazing that He Bo has accomplished to write a new book about Flowable after his previous Activiti book.
As the project lead of Flowable, and before of Activiti, it’s really great to see this well-written and technical focused book reach the light of day. He Bo goes in great length to describe the BPMN / process engine with tons of examples and possible ways to integrate Flowable with other frameworks. For anyone interested in open source BPM this book provides great content that will help you succeeding with learning about Flowable.
Note that Flowable also provides a CMMN and Event Registry engine that are not described in this book, which will be introduced in He Bo’s next book or other materials, so there’s even more material for you to look forward to and explore after learning all about the BPMN engine in this book.
I highly recommend this book for beginners, starting with Flowable, but also for developers already using Flowable and wanting to know more about it.
Tijs Rademakers
March 11, 2024
“根据熵增原理,任何企业管理的政策、制度、文化等因素在运营过程中,都会伴随有效功率的逐步减少、无效功率逐渐增加的情况,企业混乱度逐步增加,企业逐渐向无效、无序和混乱的方向运行,最终进入熵死状态。”这是任正非在《熵减:华为活力之源》中描述的企业熵增时的状态。任正非认为,这种熵增源于企业的各种内部矛盾,企业要想生成用于抵消熵增的负熵,必须通过制度、变革,激活组织与人的竞争与活力。
在21世纪初期,企业内部的生产协同更多依靠流水线作业,上下游衔接紧密,组织普遍呈树状结构,员工之间的沟通协作也通常是上下游之间的单点协作。随着互联网和移动互联网的兴起,大量企业为了满足业务需求而进行了线上化和数字化转型,生产模式发生巨大变化的同时,业务节奏显著加快,组织内部的生产协同偏向网状结构,上下游之间的单点协作也演变成各种职能角色之间的复杂协同。在此基础之上,企业通常会通过构建自己的信息化协同能力来抵御这种熵增。
我所在的企业是一家大型互联网公司,为了满足业务需求,从2012年创立开始便搭建了大量的业务类系统,随着时间的推移,业务的复杂度越来越高,各类系统不断被推倒、重构、升级。除了大量支撑业务发展的系统,也有大量支撑运营效率和内部协同效率的系统被搭建。据不完全统计,2022年,公司的各类系统已经超过3000个。随着业务的发展和业务系统的建设,组织和人员不断膨胀,组织内部的协同呈现网状结构,协同效率显著下降。2015年,公司成立了效能团队,在此之前,公司就引入了一些OA系统,但简单的OA系统根本无法满足组织内复杂的协同需求。从部门成立伊始,我就一直在思考,是否可以打造一套易用的BPM平台来满足公司复杂的网状协同需求,让大家在统一的平台上完成流程节点任务。它类似于PaaS平台,可以很方便地让各类系统接入,降低系统重复建设流程功能的成本;当公司需要搭建一个线上化流程时,可以通过简单的低代码或无代码配置快速生成一个流程,进而统一全公司的流程管理语言,通过一个引擎来寻找企业治理过程中的阻塞点,改善企业熵增的情况。
通过反复的论证和调研,我们认为这种想法是可行的,完成这个任务可以分4步走。第一步是招聘一名BPM技术专家并组建包含产品、研发和实施的全功能团队;第二步是构建全公司统一、简单易用的BPM平台;第三步是推动全公司的业务类系统、运营类系统、内部效率类系统接入;第四步是通过工作流引擎中的流程耗时来优化流程,推动企业治理,减少阻塞点。
截至2024年1月,公司内绝大多数系统都已接入BPM平台来管理流程,平台上线了1.7万余个流程模型,每周发起实例4000万个,累计发起流程实例72.61亿个,累计任务实例达到1601.81亿个,公司全员每周都在使用BPM平台进行协同。团队经受住了考验,我们也验证了最初的想法,公司流程运转效率得到了大幅提升。
回望2017年BPM团队成立伊始,我面试了很多技术专家,但贺波无疑是其中最合适的那个人,他在Activiti和Flowable框架与技术深度层面经验丰富,对BPM平台在企业内的落地路径有非常深入独到的见解,对产品有自己的思考和规划。BPM平台经历了6年多的演进,证明了贺波和他带领的团队是非常优秀的。
在接到为本书写推荐序的邀请时,我非常开心,一是因为这本书有大量的干货,二是因为它凝练了贺波和他的团队这些年在BPM领域大量的实战经验,这些经验经受住了大平台的考验,这两个特点在BPM领域的其他图书中是不多见的。
滴滴出行企业服务事业群总经理 蔡晓鸥
2024年3月29日
在数字时代,数字化转型升级是企业可持续发展的必要条件。企业业务流程的高效管理和自动化成为企业数字化转型和在竞争激烈的市场中脱颖而出的关键因素。Flowable工作流引擎作为目前业界领先的BPM和工作流引擎之一,通过支持业务流程管理和自动化,帮助企业在数字化转型过程中提高效率,降低成本,提高客户满意度,从而取得竞争优势。
当前,Flowable正以前所未有的技术深度、广度和速度迭代发展。本书的作者为读者精心打造了一张全面深入Flowable世界的地图。从Flowable的初探,到深入的技术切入,再到最实用的实战案例设计,都是作者经过反复研究、实践并以清晰的语言、图解和代码示例呈现出的精华。
贺波在研究生毕业后加入东华软件,从一线开发人员开始职业生涯,经过多年历练成长为技术负责人(技术总监),一路走来在BPM领域积累了非常丰富的技术和行业实践经验。看到贺波和他的团队能将其多年的积累编写成书,我十分欣喜。我相信本书会激发您更深层次地理解和使用Flowable的愿望,相信本书会成为您学习、实践过程中的得力助手。
最后,感谢贺波团队的努力和付出。期待您在使用Flowable打造高效、灵活的业务流程管理解决方案的道路上取得满意的成果。您手中的这本书会随时为您提供支持和陪伴。
东华软件股份公司董事长 薛向东
2024年2月20日
企业数字化转型升级已经成为企业可持续发展的必要条件,而BPM是企业流程建模和管理的核心技术,可以为企业数字化转型保驾护航。快速构建企业的BPM平台成为企业信息化系统建设中的一个难点。
随着外部环境的变化,企业的组织、管理、协作需求也在不断变化,加上企业所面临的市场竞争不断加剧,简单的流程和业务管理系统已经很难满足企业的需求。因此,需要有更灵活、更开放、更具扩展性的企业级BPM系统平台。
贺波结合他在滴滴BPM的应用实践,基于Flowable框架的深度研发和系统规划,厚积薄发,深入浅出地为企业BPM平台建设指明了方向。本书是产品经理、研发人员和运营管理者的工作流引擎开发宝典,希望本书能够推动企业业务管理和组织协同的数字化转型升级。
看到贺波和他的团队能将其多年的积累编写成书,我十分欣喜。本书干货满满,诚意十足,是企业级BPM工作流系统架构与研发的不可多得的教程。
北京中科汇联科技股份有限公司董事长 游世学
2024年5月19日
Flowable作为一款功能强大的工作流引擎,在企业数字化转型中发挥着至关重要的作用。它能够通过流程自动化持续提高效率、降低成本,并有效连接IT与业务,实现业务集成与融合,进而推动企业在数字化时代实现高质量发展。本书对Flowable的核心原理进行了详尽解读,深入剖析了其架构、设计思想及实现方式,帮助读者从理论到实践全面掌握这一工具。
在收到为本书写推荐序的邀请时,我感到非常荣幸。感谢贺波及其团队为Flowable的应用和推广做出的贡献。作为《深入Activiti流程引擎:核心原理与高阶实战》的姊妹篇,与其他技术图书相比,本书不仅深入剖析了Flowable的技术细节,更强调了其在企业中的实际应用价值。本书详细指导读者如何利用Flowable优化和自动化业务流程,提升企业的运营效率。本书理论与实践相结合,具有极高的实用性和指导意义。丰富的实战案例能让读者直观地感受Flowable在实际工作中的应用成效,加速掌握Flowable应用技巧,为企业流程自动化提供有力支持,持续获取竞争优势。
无论您是Flowable的初学者还是经验丰富的开发者,相信本书都能为您提供宝贵的启示与实用技巧。它不仅是一本技术指南,更是一本发挥Flowable最大价值的实用手册。我强烈推荐本书给对Flowable感兴趣的朋友们,期望大家共同发掘Flowable在业务流程管理中的无限潜力,持续推动数字化转型和运营创新,赋能企业高质量发展。
北京炎黄盈动科技发展有限责任公司创始人兼CEO 刘金柱
2024年3月11日
热烈祝贺贺波新作问世!作为继《深入Activiti流程引擎:核心原理与高阶实战》之后对企业级工作流引擎的深度探索,本书无疑将成为业界的又一杰作。自Activiti项目起步至今,我和我在2015年出版的《Activiti实战》一起见证了它的成长与演变,尤其是Flowable分支的崛起,代表了工作流引擎技术的新发展方向。
Flowable作为Activiti的衍生项目,继承了Activiti强大功能的同时,融合了更多创新。本书不仅延续了《深入Activiti流程引擎:核心原理与高阶实战》一书的实用主义风格,更在内容上做到了丰富与深入。书中结合了贺波及其团队在滴滴出行流程平台上的真实实践,为读者详细展现了在复杂业务场景下的Flowable应用与优化,尤其是在大规模使用中遇到的性能瓶颈及其解决方案,为企业业务流程提供了全方位指导。
对准备引入或已经在使用Flowable的企业来说,本书中的实战经验和二次开发指引将帮助其在构建本土化工作流中,少走弯路,提高效率。从基础概念到高级技巧,从研发实现到项目运维,每个环节在本书中都有详尽的讲解和案例分析,源码解析更是锦上添花。
无论是产品经理、开发人员还是运维专家,都能在本书中找到宝贵的知识和启示。本书不仅是一本教程,更是一本可供随时参考的工作手册。我相信本书将帮助更多技术人员掌握并优化自己的流程管理能力。在此毫无保留地向大家推荐这本书!
《Activiti实战》作者 闫洪磊(咖啡兔)
2024年1月8日
我们公司的企业内部信息化团队一直致力于在业务规模化发展的前提下,通过信息化和数字化提升管理效率和员工体验。贺波带领的BPM团队在这个过程中从无到有搭建了完整的流程管理平台,有效支持了公司各类业务场景的快速落地和高效运转,并能通过数据洞察持续促进流程优化。本书立足于基础、着眼于实战,干货满满,是BPM领域一本不可多得的好书。
滴滴出行企业信息化高级总监 李 淼
BPM日渐成为企业不可或缺的基础。贺波先生多年磨一剑,将自己丰富的经验沉淀下来编写成书,通过深入浅出的结构、缜密的文字把BPM呈现给广大读者。通过阅读本书,读者会全面了解BPM的“道、法、术、器”,也会在实践BPM时得到它的帮助。
滴滴出行杰出工程师 齐 贺
多年前,我所在的企业高速发展,各种系统如雨后春笋般出现,这带来了审批入口分散、审批不及时、流程难以跟踪、管理混乱等问题。当时我们想构建一套内部统一的BPM流程管理平台,却受限于内部没有专业的BPM人才、市面上没有足够专业详细的实战书籍供参考,只能摸着石头过河,遇到了很大的困难。研发负责人“三顾茅庐”,终于请到了有丰富BPM实战经验的贺波加盟,BPM的建设由此步入正轨。贺波在短短一年半内,与团队一起从无到有搭建了业界一流的BPM体系。本书结合了贺波对BPM理论知识的梳理、总结和多年BPM体系建设的实战经验。如果想通过一本书详细了解BPM的基础理论和实战落地,这本书非常适合。
滴滴出行产品运营高级总监 区 觅
本书是贺波及其领导的技术团队的又一流程引擎实战力作!全书分为4篇:基础准备篇、常规应用篇、高级实战篇和架构扩展篇,循序渐进,逐步深入,为业界同行提供了强有力的技术指导,提升了我国工作流技术领域的研发水平。本书倾注了作者的心血,作者将多年的BPM研发经验奉献给大家。本书不仅给出了翔实的研发案例,更提供了丰富的研发思路,是工作流研发的必备指导教程。
北京科技大学副教授 张庆华
业务流程管理是管理软件的灵魂,流程开发技术是软件技术人员的核心技术能力。贺波曾担任东华软件技术总监,带领产研团队从0到1建设BPM平台,并推动其商业化应用,取得了很可观的成果。他作为一线开发人员开始职业生涯,经过多年历练才成为BPM领域专家,一路走来积累了非常丰富的技术和行业经验。因此,本书理论性、实用性都很强,是难得的BPM技术教程。
东华软件股份公司高级副总裁 董玉锁
组织可以创造社会财富,维护社会秩序,推动社会进步。组织靠什么践行这些使命呢?当然是靠抱负、洞见和强有力的行动。而行动的持续有效依赖规则、流程和体系。在数字化时代,规则、流程和体系需要交给信息系统来管理,BPM应运而生。贺波先生的这本关于BPM的书将深刻的理论洞见和深厚的实践功底融合,我们不仅可以学习观念,还可以实行“拿来主义”,直接复用作者的经验。
金融街集团CIO 邓遵红
作为贺老师前一本书的读者,我在2023年有幸认识了贺老师。通过跟贺老师的交流和学习,能够强烈感受到他绝对的匠心精神,对技术的无限追求,以及对社会的无私贡献。在贺老师的指导下,我们顺利升级了公司的低代码开发平台,大大提高了公司的数字化转型能力,在资源有限的情况下,完美地完成了公司年度经营目标并超额75%。本书沉淀了贺老师十余年的经验,深入浅出地讲解了Flowable的使用,书中的所有内容在我们公司是经历了实战验证的,属于流程引擎中理论与实践并存的上品。无论是初学者还是从业专家都可以借助本书构建自己企业的流程平台,助力企业完成数字化转型。
新希望乳业股份有限公司CTO 刘文军
BPM流程引擎是企业应用中常见的基础应用构件,虽然早在十多年前OMG就发布了BPMN 2.0规范,但在国内,系统性介绍BPM基础理论,并以企业真实场景为例指导应用落地的专业图书少之又少,贺波老师的这本书很好地弥补了这一领域的空白。贺波老师作为这一领域的专家,持续耕耘在BPM理论研究与产品研发一线,书中大量的观点和代码都是他在BPM领域多年研究开发的经验沉淀和最佳实践,对于企业级BPM开发与应用具有非常强的指导意义。难能可贵的是,本书理论与实战相结合,由浅入深,照顾到了不同阶段的学习群体,相信无论是这一领域的理论研究人员还是工程实践从业人员,都会从本书中受益。
鸿泰鼎石资产管理有限责任公司信息科技部总经理 高海涛
企业级系统的构建离不开流程,很多年前成熟的企业级软件包都拥有其内部的、耦合性极强的BPM功能。随着企业级系统需求的发展和变化,独立的专业化BPM产品慢慢产生了,互联网领域也产生了开源的BPM产品——Flowable。随着互联网的发展和数字化转型的迫切需要,BPM越来越被重视,成为数字化转型的必备组件。本书以Flowable软件为基础,由浅入深,详细介绍Flowable系统及其使用案例,极具参考价值。期待本书能带您在BPM的海洋中遨游。
房车宝集团系统建设总经理 喻继鹏
BPM自引入国内以来,有力支撑了企业的流程管理和组织战略的发展,但市面上缺少对其进行系统性介绍的技术书籍。本书从实际应用问题出发,通过具体的示例介绍如何使用Flowable解决实际问题,从基础到实战落地,深入浅出地全面介绍了Flowable流程引擎,包含基本的入门知识和大量实践经验,是BPM领域的优质作品。
叮当快药CTO 于庆龙
忘掉BPM的复杂性吧!这是一本封装了Flowable力量的书,也是一本让人轻松上手、难以放下的读物。本书以实战为路标,引领您突破技术迷雾,直达专业高峰。如果想在业务流程管理中驾驭风云,本书就是您的导航仪。
阿里巴巴XRender团队
本书是我的“工作流引擎实战”系列的第一本书——《深入Activiti流程引擎:核心原理与高阶实战》的姊妹篇,也是该系列的第二本书。第一本书于2023年4月出版,备受读者欢迎和好评,出版至今已多次重印,并被多所高校馆采或选作教材。第一本书能在业界得到如此好的口碑,受到读者的认可、好评和追捧,对我来说是莫大的鼓舞。
关于编写流程引擎实战系列图书的缘起,可以追溯到5年前。当时,人民邮电出版社的刘涛老师找到我,邀请我写一本介绍BPM的书。我欣然接受,因为这也是我长久以来的一个愿望。我已从事BPM相关工作多年,回想刚接触BPM时,JBPM风头正劲,Activiti方兴未艾,但基本没有系统介绍BPM的中文版图书,网络上能找到的相关资料多为英文资料的翻译版本,很多概念语焉不详,甚至有不少错误,也没有任何实际使用的范例,导致我走了很多弯路。另外,理论学习与实际应用之间还存在很大的差距。在为多家企业提供技术咨询和经验分享时,我了解到很多企业在自研BPM方面遇到了很大的困难,甚至一些业界知名的大厂也不乏失败的案例。
回顾我职业生涯中的两段工作经历:一段是在传统软件公司作为技术负责人,从0到1研发BPM平台,并将其应用于多个商业化项目的交付;另一段是加入某知名互联网公司,带领团队从无到有搭建“倚天”BPM平台,支撑公司差异化业务和复杂流程场景的落地应用。这两段经历对应了在两个不同类型公司的成功实践,覆盖了不同业务场景,基于这些实际经验,结合理论知识,再加以沉淀总结,我相信能对行业有所贡献,避免其他企业及同行走弯路。
正是基于这些经历,我更加坚定了写介绍BPM的书的决心。在第一本书的策划阶段,经过深思熟虑,我最终决定选取受众广、实战性强并且我最擅长的方向,锚定对当时如日中天的Activiti进行介绍、剖析、应用和扩展,并由此展开企业级BPM的开发应用实战落地。第一本书出版之后,很多读者提出希望我再写一本专门介绍Flowable的书。Flowable是在Activiti的基础上演化出来的又一款应用广泛的开源流程引擎,二者内核基本相同,用法相近,但Flowable做了大量的功能增强、架构升级和优化改造。于是我开启了流程引擎实战系列的第二本书(也就是本书)的创作。
流程、流程管理和流程技术是BPM领域密不可分的3个专业术语。流程是企业和组织内被管理和支持的对象,支持着企业和组织的运营;流程管理是管理BPM领域的方法论,主要阐述与流程管理相关的理论、方法、模型等,用以管理企业和组织内的流程;流程技术是流程管理方法论的支撑,指将流程管理方法论计算机化的相关技术。
当今社会高速发展,企业和组织的外部环境瞬息万变,要求企业和组织内部的业务运营能对此快速响应,而其响应速度直接决定了它们的竞争力。从价值链角度看,企业或组织运营本质上是其众多业务流程运行的过程。因此说,流程是保证企业或组织具有竞争优势的关键所在。正如麻省理工学院斯隆管理学院莱斯特·瑟罗教授所说:“在21世纪,持续的竞争将更多地出自新流程技术,而非新产品技术。”既然流程技术如此重要,那么怎么更好地应用流程技术呢?
提到流程技术,人们第一时间会想到工作流或者BPM。工作流技术源自20世纪60年代的办公自动化应用。进入21世纪后,随着互联网、内容管理、移动终端等的广泛应用,BPM理论及其技术体系逐步产生,成为现代中间件体系的重要组成部分。流程管理属于业务领域,流程技术属于IT领域,BPM的出现模糊了业务领域和IT领域的界限,使二者有机结合起来。业务驱动需求,需求驱动技术,技术推动业务,三者形成良性循环。
有了前一本书的经验,我在本书的目录结构和章节内容的设计安排上更加驾轻就熟。全书共30章,以流程及流程管理作为引子,引出流程技术,聚焦于Flowable的应用与实战。为了更聚焦于BPM技术研发,本书在第一本书的基础上做了调整,循序渐进,逐步深入。本书内容较为详尽、覆盖面广、实战性强,结合精心挑选的案例演示,便于读者学习与理解。
写书是一项工作量巨大且漫长的任务,但有了前一本书的基础,我在本书的编写过程中更加从容。本书从选题、内容结构设计到书稿编写完成耗费了近两年的时间。因为平时工作繁忙,本书的创作只能在工作时间之外进行,所以在过去的两年里,周末和节假日的闲暇时间,乃至加班归来的夜晚,我都与文字为伴,与代码共舞。
本书创作前期的选题和内容结构设计都是我完成的,同时我负责了其中20章的编写工作。本书的编写团队与前一本书相同,我依然邀请了团队的刘晓鹏和胡海琴加入。具体写作分工为:第1~3、6、8~17、22~27章共20章由我编写,第4、5、7、18、19、21、28~30章共9章由刘晓鹏编写,第20章由胡海琴编写,全书的统稿工作由胡海琴完成。
本书得以顺利完成,首先我要感谢家人的理解与支持。两年来,节假日我基本上都沉浸在本书的创作之中,忽略了对家庭的照顾和对家人的陪伴。在此要特别感谢我的妻子尹迎,她一直给予我鼓励并对本书充满期待,同时承担起照顾家庭和教育孩子的责任。
同时,感谢人民邮电出版社的刘涛老师,他的热忱邀请给了我实现心愿的机会。感谢人民邮电出版社信息技术分社社长陈冀康老师,在本书编写过程中他给予了各种支持和帮助。感谢人民邮电出版社的张涛、郭泳泽和栾传龙三位老师,他们在创作过程中给了我很多的建议和指导,使本书得以顺利出版。在此,对参与本书出版工作的人民邮电出版社其他工作人员一并表示感谢。
还要感谢刘晓鹏和胡海琴两位伙伴,他们的“火线”加入、鼎力支持,加快了本书编写的进程。
特别感谢Flowable项目创始人Tijs Rademakers、滴滴出行企业服务事业群总经理蔡晓鸥、东华软件股份公司董事长薛向东、北京中科汇联科技股份有限公司董事长游世学、北京炎黄盈动科技发展有限责任公司创始人兼CEO刘金柱和《Activiti实战》作者咖啡兔,他们一直密切关注本书的编写进程,悉心准备了精彩的推荐序,给予了我莫大的支持和鼓励。同时,还要感谢李淼、齐贺、区觅、张庆华、董玉锁、邓遵红、刘文军、高海涛、喻继鹏、于庆龙等专家的认可和推荐。另外,IT东方会的王迪、汪锦岐和靳占风三位领导在本书成书过程中提供了诸多帮助,在此也表示感谢。
最后,我还要感谢广大的业内同行们。他们给前一本书提出了许多宝贵的意见和建议,这些意见和建议在本书的编写过程中得到了充分的吸收和采纳。比如橙单团队,为本书的结构设计和源码细节提供了一些改进建议,期间多次与我探讨各种技术和功能细节,并成功应用于橙单产品的流程模块之中。还有新希望乳业CTO刘文军,在推进由他主导的公司核心系统重大升级改造项目时,与我密切沟通落地方案,大量“尝鲜”使用了本书所介绍的设计思想、实现机制和示例代码,使得本书内容在大型集团公司的生产环境中得到了大规模的实践和应用。
在阅读本书的过程中,您将深刻感受到几位作者丰富的专业知识和饱满的分享热情。我们不仅对Flowable技术进行了深入研究,还结合了实际项目经验,为您提供了实用的建议和最佳实践。
百密总有一疏。虽然在本书的编写过程中我们严格把关质量,反复审阅校对,力求精益求精,但错误及不足之处在所难免,敬请广大读者批评指正。若读者阅读本书时发现错误或有疑问,可发电子邮件到HeboWorkFlowPro@163.com或添加微信号HeboWorkFlowPro与我联系。
希望本书能够成为您在Flowable领域的权威指南,并为您在业务流程管理方面的职业发展提供有力支撑。让我们一起踏上Flowable 的学习之旅,探索业务流程管理的无限可能性!祝您阅读愉快,学有所获!
贺 波
2024年5月于北京
随着社会的进步与经济的发展,企业规模逐渐扩大,行业之间的交叉渗透日益加深,全球范围内的竞争也越来越激烈。在残酷的市场竞争中,为了赢得市场份额和获取利润,企业需要建立一种能够快速响应市场变化、降低生产成本、提高生产效率的方法和机制。
在社会化大生产的背景下,工作的分工越来越精细,人与人之间的合作越来越重要。为了高效地组织生产,信息需要快速流动,并分发给需要这些信息的人。通过协同工作,人们可以提高完成一项工作或任务的效率。
近年来,随着计算机技术和软件技术的进步,信息化技术在企业的生产、经营和管理过程中发挥着越来越重要的作用。在当今数字化的时代,业务流程的高效管理和自动化已经成为企业在竞争激烈的市场中脱颖而出的关键因素。在这一背景下,工作流和BPM技术应运而生,用于实现“业务过程的部分或整体在计算机应用环境下的自动化”,主要解决“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标实现”。企业采用工作流或BPM技术来组织业务流程、明确业务逻辑和管理组织结构,这在很大程度上解决了企业信息化过程中出现的问题。
BPM是企业流程建模和流程管理的核心技术之一,是根据企业中业务环境的变化,推进人与人之间、人与系统之间、系统与系统之间的整合及调整的经营方法与解决方案的IT工具。通过BPM对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,可以简化企业信息化系统开发流程,方便地实现企业业务管理自动化,使企业快速地响应市场变化,提高企业组织生产率和运行效率,同时在实践过程中优化业务流程模型,实现企业流程再造,组合已有业务,不断创新。BPM在企业中应用领域广泛,凡是有业务流程的地方都可以使用BPM进行管理。早期用于OA、CRM等系统的流程审批时,可极大地提高企业的生产效率;现在用于电商、金融等领域时,可用来处理复杂的业务形态变化问题,在很多公司的大项目中担当重要角色。
Flowable是著名的Java工作流引擎Activiti的作者从Activiti分支创建的新工作流引擎,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的BPM框架。Flowable基于Apache许可的开源BPM平台,支持新的BPMN 2.0标准,为企业提供了强大的工具和平台,让企业可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN 2.0进行定义,业务流程按照预先定义的流程执行。使用Flowable,企业可以实现业务流程的自动化和优化,从而提高效率、降低成本、提高质量,并增强对业务流程的控制和可视性,在数字化时代实现业务流程的高效管理和自动化。
本书旨在为读者提供关于Flowable的全面指南,深入探讨基于业务流程开发的思想和方法。通过阅读本书,读者将快速掌握Flowable的基础知识,包括其核心概念、架构和功能。书中详细介绍了Flowable的开发技能,提供了丰富的使用技巧和最佳实践,以及大量的实际案例和示例代码,让读者可以快速、高效、全面地掌握Flowable(从入门到高级应用),帮助读者充分利用Flowable的强大功能来解决实际业务问题。
无论是开发人员、业务分析师、项目经理还是企业管理者,都可以从本书中获得宝贵的知识和经验。通过学习本书,读者将掌握如何利用Flowable来构建高效、灵活和可扩展的业务流程解决方案,从而提升企业的效率和竞争力。
本书共分为4篇:基础准备篇(包括第1~5章),主要介绍Flowable的基础用法、流程设计器集成与使用、工作流引擎配置、数据库设计、核心概念和API等,让读者建立对Flowable的基本认识;常规应用篇(包括第6~17章),主要介绍Flowable各种功能和特性的配置和使用,让读者掌握Flowable的基础用法;高级实战篇(包括第18~27章),立足实战,主要介绍如何基于Flowable的扩展特性实现对多种复杂流程场景和能力的支持;架构扩展篇(包括第28~30章),主要介绍提高Flowable性能和增大其容量的措施,并提出一套多引擎架构方案来支撑大容量、高并发和高稳定流程场景。
全书共30章,概要介绍如下。
第1章首先介绍流程、工作流和相关的规范,然后引出对Flowable的介绍,最后通过Flowable的官方应用Flowable UI演示一个简单流程的配置和运行过程,向读者展示Flowable工作流引擎的初步使用。
第2章主要介绍在IDEA和Eclipse中集成安装Flowable流程设计插件的过程,并讲解用流程设计插件绘制流程图的方法。
第3章主要介绍Flowable工作流引擎的配置方法,包含数据库连接配置,以及其他属性(如历史数据级别、异步执行器、邮件服务器等)的配置,并通过一个项目示例,引领读者掌握Flowable的配置和使用。
第4章主要介绍Flowable的数据表结构,帮助读者快速了解和掌握Flowable的数据结构,以及了解各种数据之间的相互关系。
第5章主要介绍Flowable核心接口的功能及用法。Flowable中的流程部署、流程发起、任务创建与办理等重要操作都是通过这些核心接口提供的服务来实现的。熟练掌握Flowable各个核心接口的用法,能够帮助读者更好地学习和应用Flowable框架。
第6章主要介绍Flowable内置的用户、用户组及其关系,以及使用IdentityService服务接口对用户和用户组进行操作的方法和技巧。
第7章主要介绍Flowable加载资源文件进行流程部署的过程,以及流程定义信息的各类操作,并通过具体示例详细介绍它们的用法。
第8章主要介绍Flowable支持的开始事件和结束事件,详细介绍各种事件的基本信息、应用场景和使用过程中的注意事项,并通过项目示例演示其用法。
第9章主要介绍Flowable支持的BPMN 2.0规范中定义的边界事件和中间事件,以及它们的特点和适用场景。边界事件是依附在流程活动上的“捕获型”事件,中间事件用来处理流程执行过程中抛出、捕获的事件。
第10章主要介绍Flowable的3种任务节点——用户任务、手动任务、接收任务,并展示相关应用场景。用户任务表示需要人工参与完成的工作,手动任务是会自动执行的任务,接收任务是会使流程处于等待状态并需要触发的任务,3种任务可以用于不同场景的流程建模。
第11章主要介绍Flowable的另外3种任务节点——服务任务、脚本任务、业务规则任务,并展示相关应用场景。服务任务、脚本任务和业务规则任务都是无须人工参与的自动化任务,其中服务任务可自动执行一段Java程序,脚本任务可用于执行一段脚本代码,而业务规则任务可用于执行一条或多条规则。
第12章主要介绍由Flowable扩展出来的4种任务,包括邮件任务、Camel任务、Mule任务和Shell任务,以及它们的特性和应用场景。
第13章主要介绍由Flowable扩展出来的另外4种任务,包括Http任务、外部工作者任务、Web Service任务和决策任务,以及它们的特性和应用场景。
第14章主要介绍顺序流和网关这两种BPMN元素。顺序流是连接两个流程节点的连线,流程执行完一个节点后,会沿着节点的所有外出顺序流继续执行;网关是工作流引擎中的一个重要路径决策,用来控制流程中的流向,常用于拆分或合并复杂的流程场景。
第15章主要介绍流程拆解和布局的3种方式:子流程、调用活动和泳池与泳道。可以通过子流程或者调用活动将不同的阶段规划为一个子流程,作为主流程的一部分,或通过泳池与泳道对流程节点进行区域划分。
第16章主要介绍Flowable监听器及其适用场景。执行监听器和任务监听器允许在流程和任务执行的过程中,在发生对应的流程和任务相关事件时执行特定的Java程序或者表达式,而全局事件监听器是引擎范围的事件监听器,可以监听到所有Flowable的操作事件,并且可以判断事件类型,进而执行不同的业务逻辑。
第17章主要介绍多实例的概念和配置及其应用场景,并结合具体案例介绍Flowable中多实例用户任务、多实例服务任务和多实例子流程的使用方法。
第18章介绍Flowable的核心架构。本章先对Flowable的架构设计、设计模式进行分析和梳理,然后讲解流程部署、流程启动、节点流转、网关控制等核心代码,帮助读者掌握Flowable核心架构、工作机制和原理,为后续章节的扩展改造打好基础。
第19章主要介绍Flowable集成Spring Boot。本章先简单介绍Spring Boot及starter,然后手动实现了Spring Boot与Flowable的整合,包括配置文件的加载、MyBatis的管理、事务的处理,以及通过Spring Boot管理工作流引擎实例。同时,介绍如何通过Flowable官网提供的flowable-spring-boot-starter实现Spring Boot与Flowable的集成。
第20章主要介绍Flowable与外部表单设计器集成的方法。以Xrender开源表单设计器为例介绍其与Flowable的集成,通过完整示例演示适配Xrender设计表单模型,与Flowable流程模型绑定,通过表单页面提交流程、办理任务,来提高工作流中数据收集和处理的效率。
第21章主要介绍Flowable与外部流程设计器集成的方法。以bpmn-js开源流程设计器为例介绍其与Flowable的集成,包括属性面板的配置、整体的汉化,以及流程、节点自定属性的实现等,通过完整示例演示使用bpmn-js创建符合Flowable规范的流程模型,再调用Flowable相关接口对流程进行部署和执行的过程。
第22章主要介绍自定义ProcessEngineConfiguration扩展、自定义流程元素属性、自定义流程活动行为、自定义事件、自定义流程校验和实现多租户动态切换多数据源等多种自定义扩展Flowable引擎的方式。
第23章主要介绍自定义Flowable身份管理引擎、适配国产数据库和自定义查询等多种扩展Flowable引擎的方式。
第24章主要介绍自定义流程活动、更换默认Flowable流程定义缓存、手动创建定时器任务和自定义业务日历等多种扩展Flowable引擎的方式。
第25章主要介绍通过对Flowable进行扩展封装,使其支持动态跳转、任务撤回和流程撤销等各类本土化业务流程场景的方法。这种方法在实际应用中很有代表性。
第26章主要介绍通过对Flowable进行扩展封装,使其支持通过代码创建流程模型、为流程实例动态增加临时节点、会签加签和会签减签等各类本土化业务流程场景的方法。
第27章主要介绍通过对Flowable进行扩展封装,使其支持流程复活、任务知会(流程抄送)、流程节点自动跳过、流程实例跨版本迁移、动态修改流程定义元素属性和多语种支持等各类本土化业务流程场景的方法。
第28章主要介绍Flowable的性能和容量瓶颈及其解决方案。该章从自定义ID生成器、基于MQ的定时器和历史数据异步化3个方面对Flowable底层逻辑进行了调整和优化,以提高Flowable的性能和增大其容量。
第29章主要介绍Flowable在大数据、高并发场景下的问题,以及传统分库分表方式在流程领域的局限性,并创造性地提出基于Flowable的多引擎架构方案,通过流程建模服务、路由表和网关服务,完成一个多引擎架构的初阶实现。
第30章在初阶多引擎架构基础上,通过Nacos实现流程引擎的集群模式,采用Spring Gateway实现网关的动态路由,并用Elasticsearch构建查询服务实现跨集群数据查询,从而实现高性能、高并发、高可用的Flowable多引擎流程服务。
本书有如下约定。
● 本书的示例代码均在JDK 1.8中运行,使用的数据库均为H2或MySQL数据库。
● 本书的示例代码基于IntelliJ IDEA构建,使用Maven管理JAR包依赖,使用JUnit管理测试用例,通过Lombok注解简化Java类样板代码(如getter与setter、构造函数和日志配置等)。
● 本书中列举的Java源代码省略了通过import导入指定包下的类或接口的部分,完整内容参见本书配套资源。
● 本书中列举的XML源代码(包括但不限于Maven配置文件、Flowable配置文件、Spring配置文件和流程模型文件等)如非特殊需要,均省略了命名空间配置,完整内容参见本书配套资源。
本书所有示例程序的源代码均以配套资源的方式提供,可通过异步社区下载(参见“资源与支持”)。每章的示例代码均对应一个独立的IDEA项目,导入IDEA后即可使用。
贺 波
2024年1月于北京
本书提供如下资源:
● 配套代码;
● 本书思维导图;
● 异步社区7天VIP会员。
要获得以上资源,您可以扫描下方二维码,根据指引领取。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”,输入勘误信息,单击“提交勘误”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作译者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域数十年的发展与积淀。异步图书面向IT行业以及各行业使用IT的用户。
流程是企业运作的基础,企业所有的管理和业务都需要通过流程来驱动。为了实现业务流程在计算机应用环境下的自动化,工作流技术应运而生,并诞生了工作流参考模型和BPMN 2.0等行业规范。在此之后,Flowable等一批优秀的开源工作流框架陆续出现。本章将介绍流程、工作流和相关的规范,并引出对Flowable的介绍,最后通过一个简单流程的配置和运行过程,向读者展示Flowable工作流引擎的初步使用。
本节将讲解流程的概念,并介绍工作流技术的发展和相关的行业规范,以帮助读者对这些概念有初步的了解。
《尚书·盘庚上》有云:“若网在纲,有条而不紊。”盘庚是成汤十世孙,他为解除水患,复兴殷商,决定迁都于殷(今河南安阳),史称“盘庚迁殷”。但臣民们觉得迁都工程庞大且繁杂,因而强烈反对,于是盘庚在告谕臣民的劝告之词中用了这句话,意思是“只有把网结在纲上,才会有条有理不紊乱。”这里的纲就是结网的主绳,所有其他绳子都围绕着主绳来结,就会形成一张有条不紊的网。盘庚迁殷后,整顿政治,发展经济,使衰落的商朝再现中兴,盘庚也被称为圣明之君。后世人在形容一个人做事有条理时,往往会说“有条不紊,井然有序”。
《周礼》中记载的“六官”制度,详细描述了国家行政机构和官职等组织结构,规定了各级官员的职责和工作流程。“六官”包括天官、地官、春官、夏官、秋官和冬官,官职任命有详细的流程安排和规定,每个官职都有明确的职责和权限,形成了一套完整的行政管理体系。这些官职在周朝的政治体系中起着重要的作用,负责管理不同领域的事务,维护国家的秩序和稳定。
以上是我国古籍中有关流程的一些表述。流程是指一系列有序的活动或步骤,用于完成特定的任务或达到特定的目标。到了20世纪90年代,现代流程之父迈克尔·哈默(Michael Hammer)在《企业再造》(Reengineering the Corporation)一书中提出业务流程的概念:流程是把一个或多个输入转化为对顾客有价值的输出的活动。简而言之,业务流程是企业中一系列创造价值的活动的组合。
流程在企业中无处不在,可广泛应用于各个领域,研发有研发的流程,生产有生产的流程,销售有销售的流程,财务有财务的流程。可以说,流程是企业运作的基础,企业所有的业务与管理都需要流程来驱动,通过流程可以提高效率、保证质量、降低风险、提升协同能力和实现有效的管理与监控。
工作流(workflow)起源于生产组织和办公自动化领域,是业务流程的整体或部分在计算机应用环境下的自动化,是计算机支持的协同工作的一部分。
工作流管理联盟(Workflow Management Coalition,WfMC)对工作流的定义如下:“工作流指一类能够完全或者部分自动执行的经营过程,能根据一系列过程规则,使文档、信息或任务在不同的执行者之间传递或执行。”
简单地说,工作流就是一系列相互衔接、自动进行的业务活动或任务。一个工作流不仅包括一组业务活动及它们的相互顺序关系,还包括流程及活动的启动和终止条件,以及对每个活动的描述。例如,在日常工作中,填写好请假申请表之后,需要将其提交给领导进行审批,可能根据请假时间长短,还需要提交给更上一级领导进行审批。这样一个请假申请文档就会在多人之间顺序或同时传递。对于这样的场景,可以使用工作流技术来控制和管理文档在各台计算机之间自动传递。对文档的自动化处理只是工作流技术的一种简单应用,在现实生活中工作流技术还能够完成更多更复杂的任务,例如企业内部的各种数据或信息的自动处理,多种业务流程的整合,企业之间的数据交换,甚至是跨地域的数据传输和处理等。
工作流技术是一项飞速发展的技术,它能够结合人工和机器行为,特别是能够与应用程序和工具进行交互,从而完成业务过程的自动化处理。WfMC颁布的一系列工作流产品标准,包括工作流参考模型、工作流管理系统等,奠定了工作流技术的基础。
工作流参考模型(workflow reference model)是1995年由WfMC提出的工作流管理系统体系结构模型,标识了工作流管理系统的基本组件和这些组件的交互接口,如图1.1所示。
图1.1 工作流参考模型—组件与接口
工作流参考模型中的组件包括工作流执行服务、工作流引擎、流程定义工具、工作流客户端应用、调用应用及管理和监控工具。
● 工作流执行服务由一个或多个工作流引擎组成,用于创建、管理和执行工作流实例的软件服务。
● 工作流引擎是为流程实例提供运行时执行环境的软件服务。
● 流程定义工具用于提供工作流定义服务,可以以图形方式显示并操作复杂的流程定义,并输出可被工作流引擎识别的工作流定义。
● 工作流客户端应用是一种通过请求的方式与工作流执行服务交互的应用。也可以说,工作流客户端应用调用工作流执行服务。
● 调用应用是被工作流执行服务调用的应用,调用应用与工作流执行服务交互,协作完成一个流程实例的执行。
● 管理和监控工具是管理和监控工作流管理系统的工具,包括用户管理、角色管理、审计管理、资源管理、流程监控等。
此外,工作流参考模型还定义了5个接口,用于定义以上组件间的交互接口规范。
● 接口1:工作流定义接口。此接口的规范有WPDL、XPDL、BPEL等,用于为用户提供一种可视化的、可以对实际业务进行建模的工具,并生成可被计算机处理的业务过程形式化描述。
● 接口2:工作流客户应用接口。此接口的规范为WAPI(Workflow Application Programming Interface)。它提供了一种手段,使用户可以处理流程运行过程中需要人工干预的任务[实际上就是工作项(workitem)],工作流管理系统负责维护这个工作项列表。
● 接口3:工作流调用应用接口。此接口的规范为WAPI。WAPI是工作流引擎调用外部业务应用的规范,如在流程执行过程中调用业务系统提供的接口处理业务数据等。
● 接口4:工作流引擎协作接口。此接口的规范为Wf-XML 2.0。Wf-XML 2.0是不同的工作流引擎之间进行协作的接口规范。
● 接口5:管理和监控接口。此接口的规范为CWAD(Common Workflow Audit Data)。该接口监控工作流管理系统中所有实例的状态,如组织机构管理、实例监控管理、统计分析管理等。
关于工作流参考模型的作用,2004年,大卫·霍林斯沃思(David Hollingsworth)在回顾工作流参考模型的十年历程时指出:工作流参考模型的引入为人们讨论工作流技术提供了一个规范的术语表,为在一般意义上讨论工作流系统的体系结构提供了基础;工作流参考模型为工作流管理系统的关键软件部件提供了功能描述,并描述了关键软件部件间的交互,而且这个描述是独立于特定产品或技术的实现的;工作流参考模型从功能的角度定义了5个关键软件部件的交互接口,推动了信息交换的标准化,使得不同产品间的互操作成为可能。
WfMS是一款用于定义和管理工作流,并按照在计算机中预先定义好的工作流逻辑推进工作流实例执行的软件系统。WfMS为方便修改业务交互逻辑、业务处理逻辑及参与者提供了可视化流程设计及表单设计工具,为实现WfMS的扩展提供了一系列接口。一个完整的WfMS通常由工作流引擎、工作流设计器、流程操作、工作流客户端程序、流程监控、表单设计器、与表单的集成,以及与应用程序的集成8个部分组成。WfMS的产品结构如图1.2所示。
图1.2 WfMS的产品结构
工作流引擎作为WfMS的核心部分,主要提供对工作流定义文件的解析及流程流转的支持。工作流定义文件描述了业务的交互逻辑,由工作流引擎解析并按照业务交互逻辑进行业务的流转。工作流引擎通常通过参考某种模型进行设计,通过流程调度算法进行流程流转(如流程的启动、终止、挂起、恢复等),通过各种环节调度算法实现环节的流转(如环节的合并、分叉、选择、条件选择等)。
流程设计工具一般是可视化的,用户可以以拖放元素的方式来绘制流程,并通过环节配置实现对环节操作、环节表单、环节参与者的配置。流程设计工具的好坏决定了WfMS是否易用。
流程操作指工作流支持的针对流程环节的操作,如启动、终止、挂起、分支、合并等,工作流引擎直接支持上述操作。而在实际需求中,通常需要自由操作流程,如回退、跳转、加签、减签等,对于这些操作,工作流引擎不直接支持,用户必须单独实现。是否支持流程操作直接决定了WfMS是否实用。
工作流客户端程序是WfMS的工作界面,通常以Web方式展现,通过提供待办列表和已办列表、执行流程操作、查看流程历史信息等内容,展现WfMS的功能。
流程监控以图形化方式监控流程执行过程,包括流程运转状况、每个环节耗费的时间等,流程监控数据是流程优化的依据。
表单设计工具一般是可视化的,用户可以以拖放元素的方式绘制业务所需的表单,并绑定表单数据。表单设计工具的好坏同样会决定WfMS是否易用。
通常业务流转需要表单来表达实际的业务,因此需要与表单进行集成来实现业务逻辑。与表单的集成通常包括表单数据的自动获取、存储、修改,表单域的权限控制,流程相关数据的维护,以及流程环节表单的绑定。与表单的集成程度直接决定WfMS对开发效率的提升效果。
与应用程序的集成用于完善WfMS的业务逻辑,主要涉及与权限系统及组织机构的集成。流程环节需要绑定相应的执行角色,而流程操作需要关联权限系统、组织机构。
为了将实际的业务流程转化为计算机可处理的形式化定义,2000年以后,多个标准化组织制定了各种流程描述和建模方法,如BPEL、BPMN等语言标准。BPEL是一种基于XML的、用于描写业务流程的编程语言,是一种用于产品间交换的标准,业务流程中的各步骤则由Web服务实现。BPMN是一种基于流程图的通用可视化标准,提供通用、易于理解的流程符号,它在业务流程设计与业务流程实现之间搭建了一座标准化桥梁,最新的BPMN 2.0标准于2011年发布。BPMN 2.0的出现结束了多年来多种业务流程建模语言标准竞争的局面。目前,BPMN 2.0已成为BPM及工作流的主流建模语言标准之一。
BPMN 2.0是对象管理组织(Object Management Group,OMG)于2011年推出的一种业务流程建模通用语言标准,是对BPMN 1.0的重定义。BPMN 2.0 相对于BPMN 1.0、XPDL、BPML及BPEL等规范,最大的区别在于定义了规范的执行语义和格式,利用标准图元描述真实业务发生过程,保证同一业务流程在不同的工作流引擎下的执行结果是一致的。制定BPMN 2.0标准的一个目的是提供一种能够创建简单易懂业务流程模型的机制,以处理复杂的业务流程。为此,BPMN 2.0 定义了丰富的元素,并对这些元素进行了分类,使用户能够轻松识别,从而读懂并理解模型。掌握了BPMN 2.0基本元素,就掌握了BPMN 2.0的核心。BPMN 2.0基本元素分类及符号如表1.1和表1.2所示。
表1.1 BPMN 2.0基本元素分类
基本元素分类 |
基本元素 |
---|---|
流对象(Flow Object) |
事件(Event)、活动(Activity)、网关(Gateway) |
数据(Data) |
数据对象(Data Object)、数据输入(Data Input)、数据输出(Data Output)、数据存储(Data Store) |
连接对象(Connecting Object) |
顺序流(Sequence Flow)、消息流(Message Flow)、关联(Association)、数据关联(Data Association) |
泳道(Swimlane) |
池(Pool)、通道(Lane) |
工件(Artifact) |
组(Group)、文本标注(Text Annotation) |
表1.2 BPMN 2.0基本元素符号
基本元素 |
说明 |
---|---|
事件(Event) |
事件用于表明流程整个生命周期中发生了什么,如流程的启动、结束、边界条件等; 基于发生时间对流程的影响,包含开始事件(start event)、中间事件(intermediate event)、边界事件(boundary event)和结束事件(end event),其中边界事件可看作一种特殊的中间事件;事件表示为具有开放中心的闭合圆圈,通过内部标记和圆圈粗细区分不同的事件 |
活动(Activity) |
活动是流程中执行的工作或任务,工作流中所有具备生命周期状态的操作都可以称为“活动”;活动可以是原子的[如用户任务(user task)],也可以是复合的[如子流程(sub process)];活动表示为圆角矩形 |
网关(Gateway) |
网关决定流程流转指向,可以作为条件分支或聚合,也可以作为并行执行或基于事件的排他性条件判断;网关控制流程和编排中顺序流的发散和收敛,决定了路径的分支、分叉、合并和连接;网关表示为菱形,内部标记用于区分不同行为的网关 |
顺序流(Sequence Flow) |
顺序流描述活动在流程和编排中执行的顺序;顺序流表示为实心箭头 |
消息流(Message Flow) |
消息流用于显示两个参与者之间的消息流动 |
关联(Association) |
关联是用于连接消息和活动的图形元素;文本标注和其他活动都可以以这种图形元素连接 |
池(Pool) |
池是协作中参与者的图形表示,还充当“泳道”和图形容器,用于从其他池中划分一组活动;池中可以有内部细节,包含将要执行的进程,也可以没有内部细节,作为一个“黑匣子” |
通道(Lane) |
通道是流程或池中的子分区,用于在横向或纵向延长整个流程,常用于组织和分类活动 |
数据对象(Data Object) |
数据对象提供活动所需的信息,或者活动产生的信息;数据对象可以表示单个对象或对象的集合 |
消息(Message) |
消息用于描述两个参与者之间的通信内容 |
组(Group) |
组将同一类别的一组图形元素直观地显示在流程图上,主要用于分析或文档化流程,不影响组内的序列流 |
文本标注(Text Annotation) |
文本标注是建模者为流程图的阅读者提供的附加文本信息 |
图1.3使用BPMN 2.0中的图形符号创建了一个简单请假流程示例,主要由事件、活动、网关和顺序流这4 种基本元素构成。
图1.3 简单请假流程示例
流程定义文件的扩展名一般为.bpmn.xml或者.bpmn20.xml,可以看出BPMN 2.0实际上基于XML表示业务流程。使用文本编辑器可以打开该请假流程示例的流程定义文件,其内容如下:
<?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="http://www.activiti.org/processdef">
<process id="process_simple" name="请假流程" isExecutable="true">
<startEvent id="startEvent1"/>
<userTask id="leave_apply" name="请假申请" activiti:assignee="${initiator}"
activiti:formKey="simple_form"/>
<sequenceFlow id="sf1" sourceRef="startEvent1" targetRef="leave_apply"/>
<userTask id="leader_approval" name="领导审批" activiti:assignee="${leader}"
activiti:formKey="simple_form"/>
<sequenceFlow id="sf2" sourceRef="leave_apply" targetRef="leader_approval"/>
<exclusiveGateway id="gateway1"/>
<sequenceFlow id="sf3" sourceRef="leader_approval" targetRef="gateway1"/>
<serviceTask id="holiday_management" name="假期管理"/>
<endEvent id="endEvent1"/>
<sequenceFlow id="sf4" sourceRef="holiday_management" targetRef="endEvent1"/>
<sequenceFlow id="sf5" name="通过" sourceRef="gateway1"
targetRef="holiday_management">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${task_领导审批_outcome=='agree'}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow id="sf6" name="驳回" sourceRef="gateway1" targetRef="leave_apply">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[${task_领导审批_outcome=='disagree'}]]></conditionExpression>
</sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_qj">
<bpmndi:BPMNPlane bpmnElement="qj" id="BPMNPlane_qj">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="leave_apply" id="BPMNShape_leave_apply">
<omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="leader_approval" id="BPMNShape_leader_approval">
<omgdc:Bounds height="80.0" width="100.0" x="320.0" y="138.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="gateway1" id="BPMNShape_gateway1">
<omgdc:Bounds height="40.0" width="40.0" x="465.0" y="158.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="holiday_management"
id="BPMNShape_holiday_management">
<omgdc:Bounds height="80.0" width="100.0" x="570.0" y="138.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endEvent1" id="BPMNShape_endEvent1">
<omgdc:Bounds height="28.0" width="28.0" x="715.0" y="164.0"/>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sf5" id="BPMNEdge_sf5">
<omgdi:waypoint x="504.57089552238807" y="178.42910447761193"/>
<omgdi:waypoint x="570.0" y="178.18587360594796"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sf1" id="BPMNEdge_sf1">
<omgdi:waypoint x="130.0" y="178.0"/>
<omgdi:waypoint x="175.0" y="178.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sf4" id="BPMNEdge_sf4">
<omgdi:waypoint x="670.0" y="178.0"/>
<omgdi:waypoint x="715.0" y="178.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sf2" id="BPMNEdge_sf2">
<omgdi:waypoint x="275.0" y="178.0"/>
<omgdi:waypoint x="320.0" y="178.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sf6" id="BPMNEdge_sf6">
<omgdi:waypoint x="485.5" y="158.5"/>
<omgdi:waypoint x="485.5" y="110.0"/>
<omgdi:waypoint x="225.0" y="110.0"/>
<omgdi:waypoint x="225.0" y="138.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sf3" id="BPMNEdge_sf3">
<omgdi:waypoint x="420.0" y="178.2164502164502"/>
<omgdi:waypoint x="465.4130434782609" y="178.41304347826087"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
流程定义文件的根元素是definitions,该元素至少需要包含xmlns和targetNamespace两个属性,xmlns用于声明默认命名空间,targetNamespace用于声明目标命名空间。这些属性值通常表示为固定的URI。每个流程定义文件都必须包含这些属性。此外,每个流程定义文件都包含BPMN业务流程和流程图形化展示两部分,分别对应根元素definitions的两个子元素:process和BPMNDiagram。
子元素process代表一个真正的业务流程定义。definitions可以包含多个process,不过建议只包含一个,以简化流程定义开发和维护的难度。process元素有3个属性:id、name和isExecutable。属性id是必填项,是业务流程的标识,用以启动一个流程实例;属性name用于定义业务流程名称;属性isExecutable用于定义流程是否可执行。
使用BPMN定义的元素都包含在process元素下,在上述请假流程示例的流程定义文件中,process元素包括1个开始事件(startEvent)、2个用户任务(userTask)、1个排他网关(exclusiveGateway)、1个服务任务(serviceTask)、1个结束事件(endEvent)和6个顺序流(sequenceFlow)。工作流引擎在执行业务流程时会读取这部分内容来获取业务流程规则。
BPMNDiagram定义了业务流程模型的布局,包括每个BPMN元素的位置和大小等信息。流程设计工具可以根据BPMNDiagram中的描述信息绘制可视化流程图,让用户直观地理解业务流程。
在BPMN 2.0基本元素中,要重点掌握事件、活动、网关这3类流对象。它们是BPMN 2.0的核心结构,如图1.4所示。
图1.4 BPMN 2.0核心结构
1)事件
事件主要分为开始事件、中间事件、边界事件和结束事件。
开始事件是流程的起点,定义流程如何启动,以及显示的图标类型。在流程定义文件中,开始事件类型由子元素声明定义。根据不同的触发条件,可将开始事件分为不同类型,如表1.3所示。
表1.3 依触发条件划分的开始事件类型
触发条件 |
说明 |
详细介绍 |
---|---|---|
无(none) |
未指定启动流程实例触发器的开始事件 |
参阅8.3.1小节 |
定时器(timer) |
定时器开始事件:在指定时间创建流程实例。在流程只需启动一次,或者需在特定时间间隔重复启动时,可以使用定时器开始事件 |
参阅8.3.2小节 |
信号(signal) |
使用具名信号启动流程实例 |
参阅8.3.3小节 |
消息(message) |
使用具名消息启动流程实例 |
参阅8.3.4小节 |
错误(error) |
错误开始事件总是中断,可用于触发事件子流程,不能用于启动流程实例 |
参阅8.3.5小节 |
升级(escalation) |
升级开始事件只能用于触发事件子流程,不能用于启动流程实例 |
参阅8.3.6小节 |
条件(conditional) |
条件开始事件只能用于触发事件子流程。条件开始事件用于根据特定条件来启动子流程。当满足条件时,子流程会被启动并执行 |
参阅8.3.7小节 |
变量监听(variable listener) |
通过监听指定变量的变化来发起流程实例 |
参阅8.3.8小节 |
结束事件标志着流程或子流程中的一个分支结束。结束事件总是抛出型事件。这意味着当流程执行到达结束事件时,会抛出一个结果,结果类型由事件内部自带的填充图标表示。在流程定义文件中,结束事件类型由子元素声明定义。根据不同的触发条件,可将结束事件分为不同类型,如表1.4所示。
表1.4 依触发条件划分的结束事件类型
触发条件 |
说明 |
详细介绍 |
---|---|---|
无(none) |
空的结束事件意味着当流程执行到这个事件时,无指定的抛出结果。工作流引擎除结束当前执行分支,不做任何操作 |
参阅8.4.1小节 |
错误(error) |
当流程执行到错误结束事件时,结束执行当前分支,并抛出错误,这个错误可以由匹配的错误边界中间事件捕获。如果找不到匹配的错误边界中间事件,则会抛出异常 |
参阅8.4.2小节 |
取消(cancel) |
取消结束事件只能与BPMN事务子流程同时使用。当流程执行到取消结束事件时,会抛出取消事件,且必须由取消边界事件捕获。取消边界事件将取消BPMN事务,并触发补偿 |
参阅8.4.3小节 |
终止(terminate) |
当流程执行到终止结束事件时,当前流程实例或子流程会被终止 |
参阅8.4.4小节 |
升级(escalation) |
当流程到达升级结束事件时,当前路径的执行结束,并且会抛出升级 |
参阅8.4.5小节 |
开始事件和结束事件之间发生的事件统称为中间事件。中间事件会影响流程的流转路径,但不会启动或直接终止流程。按照其特性,中间事件又可分为中间捕获事件和中间抛出事件两类。当流程执行到中间捕获事件时,它会一直处于待触发状态,直到接收特定信息时被触发;当流程执行到中间抛出事件时,它会被自动触发并抛出相应的结果或者信息。中间事件类型如表1.5所示。
表1.5 中间事件类型
类型 |
说明 |
详细介绍 |
---|---|---|
定时器中间捕获事件 |
当流程执行到定时器中间捕获事件时,启动定时器;当定时器触发后(如间隔一段时间后触发),沿定时器中间捕获事件的外出顺序流继续执行 |
参阅9.2.1小节 |
信号中间捕获事件(signal intermediate |
用于捕获与其引用的信号定义具有相同信号名称的信号。与其他事件(如错误事件)不同,信号在被信号中间捕获事件捕获后不会被消耗。如果两个激活的信号中间捕获事件同时捕获了相同的信号,则这两个事件都会被触发,即使它们并不处于同一个流程实例中 |
参阅9.2.2小节 |
信号中间抛出事件(signal intermediate |
用于抛出流程中的定义信号 |
参阅9.2.2小节 |
消息中间捕获事件(message intermediate |
用于捕获特定名称的消息 |
参阅9.2.3小节 |
补偿中间抛出事件(compensate intermediate |
用于触发补偿。当执行到补偿中间抛出事件时,会触发该流程已完成活动的边界补偿事件 |
参阅9.2.4小节 |
空中间抛出事件(intermediate throwing none event) |
用于指示流程已经处于某种状态 |
参阅9.2.5小节 |
条件中间捕获事件(conditional intermediate |
等待接收符合条件的事件时触发 |
参阅9.2.6小节 |
变量监听器中间捕获事件(variable listener |
等待指定的变量变化事件时触发 |
参阅9.2.7小节 |
升级中间抛出事件(escalation intermediate throwing event) |
用于抛出升级事件 |
参阅9.2.8小节 |
边界事件是一种特殊的中间事件,依附在活动上。边界事件永远不会抛出。这意味着当活动运行时,边界事件将监听特定类型的触发器。当工作流引擎捕获到边界事件时,会终止活动,并沿该事件的外出顺序流继续执行。根据不同的触发条件,可将边界事件分为不同类型,如表1.6所示。
表1.6 依触发条件划分的边界事件类型
触发条件 |
说明 |
详细介绍 |
---|---|---|
定时器(timer) |
当流程执行到边界事件所依附的活动时,将启动定时器。定时器触发后(如间隔特定时间后触发),会中断活动,并沿着边界事件的外出顺序流继续执行 |
参阅9.1.1小节 |
信号(signal) |
依附在活动边界上的信号中间捕获事件,用于捕获与其信号定义具有相同名称的信号 |
参阅9.1.2小节 |
消息(message) |
依附在活动边界上的消息中间捕获事件,用于捕获与其消息定义具有相同名称的消息 |
参阅9.1.3小节 |
错误(error) |
依附在活动边界上的错误中间捕获事件,捕获其所依附的活动范围内抛出的错误。在嵌入式子流程或者调用活动上定义错误边界事件最有意义,因为子流程活动范围包括其中的所有活动。错误可以由错误结束事件抛出。错误会逐层向其上级活动范围传播,直到活动找到一个匹配错误事件定义的错误边界事件。当捕获错误边界事件时,会销毁错误边界事件定义所在的活动,同时销毁其中所有当前执行活动(如并行活动、嵌套子流程等)。流程将沿着错误边界事件的外出顺序流继续执行 |
参阅9.1.4小节 |
取消(cancel) |
依附在事务子流程边界上的取消中间捕获事件,在事务取消时触发。当取消边界事件触发后,先会中断当前活动范围内所有活动的执行,然后,启动事务活动范围内所有有效补偿边界事件。补偿会同步执行,也就是说,在离开事务前,边界事件会等待补偿完成。当补偿完成后,流程沿取消边界事件的任何外出顺序流离开事务子流程 |
参阅9.1.5小节 |
补偿(compensation) |
依附在活动边界上的补偿中间捕获事件,用于为活动附加补偿处理器。补偿边界事件必须使用直接关联方式引用单个补偿处理器。补偿边界事件与其他边界事件的活动策略有所不同。其他边界事件,如信号边界事件,在其依附的活动启动时激活,当该活动结束时结束,并取消相应的事件订阅。补偿边界事件在其依附的活动成功完成时激活,同时创建补偿边界事件的相应订阅。当补偿边界事件被触发或者相应的流程实例结束时,才会移除相应的订阅 |
参阅9.1.6小节 |
条件(conditional) |
条件边界事件可以附加在某个流程活动上,当流程到达该流程活动时,在其依附的流程活动的生命周期内会根据指定的条件来判断是否触发边界事件。如果条件满足,则会触发边界事件,流程会沿其外出顺序流继续流转。如果该边界事件设置为中断,依附的流程活动将被终止 |
参阅9.1.7小节 |
变量监听(variable |
变量监听器边界事件可以附加在某个流程活动上,当流程到达该流程活动时,工作流引擎会创建一个捕获事件,在其依附的流程活动的生命周期内会监听变量的变化来判断是否触发边界事件。如果条件满足,则会触发边界事件,流程会沿其外出顺序流继续流转。如果该边界事件设置为中断,依附的流程活动将被终止 |
参阅9.1.8小节 |
升级(escalation) |
升级边界事件只能依附于一个子流程,或者一个调用活动。升级只能被升级中间抛出事件或者升级结束事件抛出 |
参阅9.1.9小节 |
2)活动
活动是业务流程定义的核心元素,是业务流程中执行的工作或任务的统称。在工作流中所有具备生命周期状态的元素可以称为“活动”。
活动既可以是流程的基本处理单元(如用户任务、服务任务等),也可以是组合单元(如调用活动、嵌套子流程等)。
活动表示为圆角矩形。活动类型如表1.7所示。
表1.7 活动类型
类型 |
说明 |
详细介绍 |
---|---|---|
用户任务(user task) |
也称为人工任务,指对需要人工执行的任务进行建模。当流程执行到用户任务时,会在指派到该任务的用户或组的任务列表中创建一个新任务 |
参阅10.1节 |
手动任务(manual |
手动任务在流程中几乎不做任何操作,只是在流程历史记录中留下一点痕迹,表明流程走过哪些节点。对工作流引擎而言,手动任务是作为直接通过的活动处理的,流程执行到此会自动继续执行 |
参阅10.2节 |
接收任务(receive |
接收任务是一个简单的任务,等待某个消息的到来。当流程执行到接收任务时,流程将一直保持等待状态,工作流引擎接收到特定消息时,会触发流程继续执行接收任务 |
参阅10.3节 |
服务任务(service |
一个自动化任务。当流程执行到服务任务时,调用某些服务(如网页服务、Java服务等),然后继续执行后继任务 |
参阅11.1节 |
脚本任务(script |
一个自动化任务。当流程执行到脚本任务时,会自动执行编写的脚本,然后继续执行后继任务。Activiti支持的脚本语言有Groovy、JavaScript、BeanShell等 |
参阅11.2节 |
业务规则任务(business rule task) |
用于同步执行一个或多个规则,可以通过制定一系列规则来实现流程自动化。Activiti使用Drool规则引擎来执行业务规则 |
参阅11.3节 |
邮件任务(mail task) |
服务任务的一种扩展任务,旨在向外部参与者(相对于流程)发送邮件。一旦邮件被发送,任务就完成了 |
参阅12.1节 |
Camel任务(Camel |
服务任务的一种扩展任务,可以向Camel(一种基于规则的路由和中介引擎)发送和接收消息 |
参阅12.2节 |
Mule任务(Mule task) |
服务任务的一种扩展任务,可以向Mule(一款轻量级的企业服务总线和集成平台)发送消息 |
参阅12.3节 |
Shell任务(Shell task) |
服务任务的一种扩展任务,可以在流程执行过程中运行Shell脚本与命令 |
参阅12.4节 |
Http任务(http task) |
Http任务是用于发出HTTP请求的任务,它可以发送HTTP请求并接收响应,可以执行GET、POST、PUT和DELETE等不同类型的请求 |
参阅13.1节 |
外部工作者任务(external worker task) |
允许创建由“外部工作者”获取并执行的任务。外部工作者可通过Java API或REST API获取该任务 |
参阅13.2节 |
Web Service任务(Web |
服务任务的一种扩展任务,可以通过Web Service通信技术同步调用外部Web服务 |
参阅13.3节 |
决策任务(decision |
用于根据预定义的规则和条件对流程进行决策 |
参阅13.4节 |
子流程(sub process) |
一个可以包含其他活动、分支、事件等的活动,经常用于分解大的复杂的业务流程 |
参阅15.1节 |
调用活动(call activity) |
可以在一个流程定义中调用另一个独立的流程定义 |
参阅15.2节 |
3)网关
网关用于控制顺序流在流程中的汇聚和发散。从其名称可以看出,它具备网关门控机制。网关与活动一样,能够使用或生成额外的令牌,可以有效控制给定流程的执行语义。两者的主要区别在于,网关不代表正在完成的“工作”,它对正在执行的流程的运行成本、时间等的影响为零。
网关可以定义所有类型的业务流程序列流行为,如决策/分支(独占、包含和复杂)、合并、分叉和加入等。网关表示为菱形,虽然菱形传统上用于表示排他性决策,但BPMN 2.0扩展了菱形行为,所有类型的网关都有一个内部指示器或标记来表明正在使用的网关类型。网关类型如表1.8所示。
表1.8 网关类型
类型 |
说明 |
详细介绍 |
---|---|---|
排他网关(exclusive |
排他网关用于对流程中的决策进行建模。当流程执行到该网关时,会按照所有外出顺序流定义的顺序对它们进行计算,选择第一个条件计算结果为true的顺序流继续执行 |
参阅14.2.1小节 |
并行网关(parallel |
并行网关可以将执行分支(fork)为多条路径,也可以合并(join)多条入口路径的执行。并行网关与其他网关类型有一个重要区别:并行网关不计算条件。如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件 |
参阅14.2.2小节 |
包容网关(inclusive |
包容网关可以看作排他网关与并行网关的组合。与排他网关一样,可以在包容网关的外出顺序流上定义条件,包容网关会自动计算条件。两者的主要区别在于,包容网关类似并行网关,可以同时选择多条外出顺序流 |
参阅14.2.3小节 |
事件网关(event- |
事件网关提供了基于事件的选择方式。网关的每一条外出顺序流都需要连接到一个中间捕获事件。当流程执行到基于事件的网关时,与等待状态类似,该网关会暂停执行,并且为每一条外出顺序流创建一个事件订阅 |
参阅14.2.4小节 |
Flowable是一个基于Java的开源工作流引擎,用于管理和执行复杂的业务流程。它提供了一套强大的工具和功能,用于定义、模拟、执行和监控业务流程。Flowable支持BPMN 2.0规范,并提供了一系列的API和界面,使开发人员能够轻松地创建、部署和管理业务流程。Flowable还提供了与其他系统集成的能力,如与REST API、消息队列和数据库的集成,以便实现更复杂的业务流程。Flowable是一个灵活和可扩展的工作流引擎,适用于各种规模和类型的业务流程管理。
目前市面上主流的工作流开源框架有4个,分别是jBPM、Activiti、Camunda和Flowable。其中,Activiti、Camunda和Flowable均基于jBPM 4.0框架演化而来,它们之间的关系如图1.5所示。
图1.5 jBPM、Activiti、Camunda、Flowable之间的关系
jBPM 4.0是JBoss公司推出的一款工作流开源框架,后来由于团队内部出现分歧,部分团队核心人员离开JBoss公司加入Alfresco公司,很快Alfresco公司推出了新的基于jBPM 4.0的开源工作流框架Activiti 5.0。
Activiti 5.0以jBPM 4.0为基础,继承了jBPM 4.0强大的可扩展能力,同时增强了流程可视化与管理能力。Activiti 5.0经过一段时间的发展,衍生出了Camunda框架,Activiti 5.0也向Activiti 6.0演化。Activiti 6.0开发过程中,核心开发团队产生分歧,分化出了Flowable。Flowable 5基于Activiti 5的分支重构而成,到了Flowable 6.0时,不仅修复了很多Activiti 6.0的bug,还注入了更多的新特性。
本书选用Flowable来讲解企业级工作流引擎开发与应用的实现,一方面是因为Flowable免费开源、稳定可靠、应用广泛,另一方面是因为Flowable有着十分优秀的设计思想及代码风格,易于入门。
作为Activiti的分支,Flowable不但继承前者功能强大、稳定可靠的特点,而且更加注重功能性、扩展性、性能方面的优化。
● 更完善的功能。Flowable引入了CMMN(Case Management Model and Notation)和DMN(Decision Model and Notation)来支持更复杂的流程建模和执行,增加支持动态流程,支持Http任务等新的类型节点,提供跳转API等。本书会详细介绍Flowable新增扩展的各种功能。
● 更优的性能。为提升运行效率,工作流引擎通常会将运行时数据与历史数据进行分离,历史数据通过事务同步写入的方式来实现,但随着历史数据的增长,系统的性能会急剧下降,容量也会达到瓶颈。Flowable提供一系列方法实现历史数据异步存储,并支持不同数据存储引擎来存储历史数据,从而提升性能及容量。
● Flowable也对异步任务进行了优化。在有大量异步任务的情况下,通常Flowable通过引入更多的执行实例来提升执行效率和提高吞吐量,但在高并发场景下这会引发Job抢占执行的问题,造成性能下降,Flowable通过引入全局锁来解决这一问题。
本节将介绍正式使用Flowable进行开发前的基础准备工作,包括下载与启动Flowable官方提供的应用Flowable UI,并通过Flowable UI来演示Flowable提供的功能,向读者展示Flowable工作流引擎的初步使用及能力。
本书使用Flowable 6.8.0版本,可从Flowable官方网站下载相应安装包。
将下载的flowable-6.8.0.zip文件解压缩,得到图1.6所示的文件目录。
图1.6 flowable-6.8.0文件目录
从图1.6中可以看到4个文件夹,即database、docs、libs和wars,它们的用途分别如下。
● database:存放Flowable数据库表的创建、修改和升级SQL脚本,不同数据库有不同的SQL文件。目前Flowable支持DB2、Oracle、SQL Server、MySQL、PostgreSQL、HSQL、CockroachDB和H2等数据库。
● docs:存放Flowable的文档,如用户指南和API文档。
● libs:存放Flowable发布的JAR包,包含JAR包和源码包。
● wars:存放Flowable官方提供的WAR包,包括flowable-rest.war和flowable-ui.war两个WAR包。其中,flowable-rest.war主要提供Flowable的rest接口,Flowable通过统一的restful接口来服务,主要有部署管理、任务管理、流程管理等功能,可以不通过Java API来调用相关接口。flowable-ui.war是Flowable工作流引擎的用户界面应用Flowable UI,它提供了一个可视化的用户界面,用户可以通过这个界面来创建、部署和管理流程,以及监控和执行这些流程。
可以通过两种方式来启动Flowable UI:一种方式是将flowable-ui.war文件复制到Tomcat的webapps目录下,通过启动Tomcat即可运行Flowable UI;另一种方式是独立运行Flowable UI,它是基于Spring Boot 2.0开发的,可以直接以独立应用模式运行,而不需要应用服务器。后一种方式需要进入flowable-ui.war所在目录中,执行如下命令启动Flowable UI:
java -jar flowable-ui.war
通过以上任意一种方式启动Flowable UI后,通过浏览器访问http://localhost:8080/flowable-ui,可以看到图1.7所示的登录页面。
图1.7 Flowable UI登录页面
默认情况下,Flowable UI应用内置默认管理员账号,用户名为admin,密码为test。输入用户名和密码,成功登录后,进入图1.8所示的界面。
图1.8 Flowable UI主页面
从图1.8可以看出,Flowable UI包含以下4个模块。
● 任务应用(Flowable task):这个模块主要进行流程相关的操作,提供了启动流程实例、编辑任务表单、完成任务,以及查询流程实例与任务的功能。
● 建模器应用(Flowable modeler):让拥有建模权限的用户可以创建流程模型、表单、决策表与应用定义。
● 管理员应用(Flowable admin):让拥有管理员权限的用户可以查询流程模型、表单、决策表等,并提供了许多选项用于修改流程实例、任务、作业等。
● 身份管理应用(Flowable IDM):为所有Flowable UI应用提供单点登录认证功能,并且为拥有IDM 管理员权限的用户提供了管理用户、组与权限的功能。
需要注意的是,由于Flowable UI默认使用H2内存数据库,重启应用后存储数据会丢失。
Flowable UI是Flowable提供的一套较为完整的工作流应用,可以通过它体验Flowable的大部分功能。本节将以一个简单的报销流程制作为例,向读者展示Flowable的功能,使读者对工作流引擎有初步的了解。
在本报销流程中,员工发起报销申请,由财务经理审批。其流程如图1.9所示。
图1.9 报销流程示例
由图1.9可知,报销流程包含员工报销申请和财务经理审批两个环节,因此需要创建两个用户:员工(staff)和经理(manager)。
使用admin账号登录Flowable UI后,进入图1.8所示的页面,单击身份管理应用程序,跳转到身份管理页面,单击“用户”标签,切换到用户管理页面,如图1.10所示。
图1.10 用户管理页面
单击“创建用户”按钮,就会弹出创建用户界面,如图1.11所示,需要输入用户id、邮箱、密码等信息。这里我们创建两个用户,用户id分别是staff和manager,创建完成后页面如图1.12所示。
使用admin账号登录Flowable UI后,进入图1.8所示的页面,单击建模器应用程序,进入流程模型管理页面,如图1.13所示。
单击“创建流程”按钮,跳转到新建流程模型界面,如图1.14所示,输入模型名称、模型key、描述等信息,单击“创建新模型”按钮。
图1.11 创建用户界面
图1.12 用户创建完成页面
图1.13 流程模型管理页面
图1.14 新建流程模型界面
此时跳转到图1.15所示的流程模型设计页面,根据图1.9所示的报销流程,通过鼠标拖放可视化组件绘制流程模型。
图1.15 流程模型设计页面(“中间捕捉事件”本书称“中间捕获事件”)
从图1.15可知,该流程模型中定义了一个开始事件、两个用户任务和一个结束事件。接下来,将两个用户任务分别分配给staff和manager用户。在画布上单击第一个用户任务,在打开的属性面板上单击“分配用户”属性,进入图1.16所示的界面,将“员工报销申请”任务分配给“员工”用户(“员工”是用户的真实名称,其用户id为staff),单击“保存”按钮保存配置。采用同样的方法,将“财务经理审批”任务分配给“经理”用户(“经理”是用户的真实名称,其用户id为manager)。配置完成后,切换到流程模型设计界面,单击“保存模型”按钮(图1.15所示界面画布顶部工具栏左侧第一个按钮)保存流程模型。
图1.16 分配用户任务办理人界面
流程模型创建完成之后,就可以部署了。在Flowable UI中,一个应用可包含多个流程模型,因此在发布流程前,先新建一个应用程序并为其设置流程模型。在图1.13所示的页面中,单击“应用程序”标签,跳转到应用程序管理页面,单击“创建应用程序”按钮,进入新建应用程序定义界面,如图1.17所示,输入应用程序定义名称、应用程序定义key和描述后,单击“创建新的应用程序定义”按钮即可新建一个应用程序,跳转到图1.18所示的页面。
接下来为其设置流程模型。在图1.18所示的页面中,单击“编辑包含的模型”按钮,进入流程模型选择界面,如图1.19所示。选中流程模型之后,单击“关闭”按钮完成配置。
图1.17 新建应用程序定义界面
图1.18 App定义详细信息页面1
图1.19 流程模型选择界面
此时即可发布该应用程序。单击“应用程序”标签,跳转到应用程序管理页面,在页面中单击“报销App”图标,跳转到App定义详情信息页面,如图1.20所示,单击右上角的“发布”按钮即可发布应用程序。
完成以上步骤后,我们使用创建的账号staff启动一个流程实例。启动流程实例前需要先给创建的两个账号staff和manager赋权限,这样它们才能看到创建的报销App应用。在图1.8所示的页面中单击身份管理应用程序,再单击“权限控制”标签,在左侧“访问workflow应用”菜单下添加用户staff和manager的权限,如图1.21所示。
图1.20 App定义详细信息页面2
图1.21 分配workflow应用访问权限
使用staff账号重新登录系统,便能看到刚发布的应用程序,如图1.22所示。
图1.22 刚发布的“报销App”
单击“报销App”,进入“报销App”应用,再单击“流程”标签,即可在流程列表中找到刚才创建的报销流程,如图1.23所示。单击“启动流程”按钮,就可以成功启动一个流程实例。
图1.23 启动流程页面
根据流程模型的定义可知,启动流程后,由staff用户完成第一个用户任务。单击“任务”标签,跳转到图1.24所示的页面,在左侧任务列表中选中要办理的任务,单击右上角的“完成”按钮即可完成当前用户任务。
staff完成任务后,由manager完成第二个用户任务。使用manager账号登录系统,进入“报销App”应用,单击“任务”标签,同样可以看到分配给manager用户的任务,以同样的方式完成任务后,报销流程结束。至此,一个简单的员工报销流程在Flowable UI上运行成功。
图1.24 办理任务页面
使用admin账号登录后,进入“管理员”应用,单击“流程引擎”标签,即可查看部署对象、定义、实例、任务等各类信息,单击“实例”标签,如图1.25所示,可查看所有的流程。
图1.25 查看流程实例页面
在流程实例列表中单击流程实例即可查看实例详细信息,如图1.26所示。
图1.26 流程实例详细信息页面
“管理员”应用中的其他标签这里不做介绍,读者可以自行体验。
“管理员”应用中的数据都可以通过Flowable提供的接口获取,接口的使用将在本书后续章节讲述。
本章首先讲解了流程的概念,并介绍了工作流技术的发展和相关的行业规范,帮助读者初步了解这些概念,接下来介绍了Flowable开源工作流框架,最后基于Flowable提供的官方应用,通过一个报销流程的设计、发布、执行、监控的全演示,让读者对Flowable工作流引擎有了初步的认识。本章的学习为读者进一步探索和应用工作流技术奠定了基础。