Activiti实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-12 14:13:44

点击下载

作者:闫洪磊

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Activiti实战

Activiti实战试读:

前言

技术,因此对他印象比较深刻。

后来我自己创业,正巧合他也有意向,我们一起一干就是4年。因为是创业公司,我们对框架和平台的选择主要聚焦在开源项目上。工作流平台的选择是个艰难的决定,在对比jBPM5与Tom发起的Activiti后,我决定接受洪磊的建议选择Activiti。

我们公司对这本书的写作极其重视。书中引用的很多案例,都源自实际的项目中的使用经验。在使用过程中也遇到了一些不能满足需求的地方,因此我们自己做了一些改动并通过Github贡献了源代码。目前为止,我们公司是中国地区对Activiti贡献代码次数最多的团队,洪磊是团队的技术核心。这本书也算是对Activiti项目以及对开源代码社区饮水思源的一种表达吧。

今年我们做了一个汽车电商项目——小马购车,初期拿到千万级天使投资,依然选择Activiti作为后台业务系统的流程引擎。事实证明Activiti都能轻松“Hold”住各种应用场景。

希望本书能给大家在Activiti实战中带来更多的帮助。小马购车CTO郑国强

咖啡兔同学的《Activiti实战》终于出炉,欣喜之情溢于言表。虽然国内的工作流产品繁多,但是开源一直为Activiti和jBPM垄断。相对来说Activiti延续了一贯方便灵活的特性,又不会在功能上有半分折损,在国内拥有大量的粉丝。咖啡兔同学此前一直致力于Activiti在国内的推广与传播,先后开辟了专栏博客、Activiti论坛网站、QQ群组,并且积极参与Activiti的官方开发,可以说Activiti在国内能达到当前的认知程度,他是功不可没的。可惜,国内尚缺一本可以为Activiti新手答疑解惑,带初阶者更上一层楼的实体书籍。我觉得,这个任务由一直积极活跃于Activiti开源社区,既拥有实际流程项目设计研发经验,又为Activiti官方内核提交过代码的洪磊是再合适不过了。

全书由浅入深地引导读者进入工作流的殿堂,不仅覆盖常见的流程功能与实现方法,还专门提供了作者在实践中总结的经验方法,因此本书必将成为学习流程道路上的得力助手。小米公司高级软件研发工程师《深入浅出Ext JS》作者 jBPM、Activiti国内推广者徐会生

在开源BPM领域,你或许不知道“闫洪磊”是谁,但你必须听说过“咖啡兔”,否则,你不能说你曾经玩过开源BPM!

咖啡兔是我从事BPM工作几年来,少有的一位对BPM领域有较深认识的人,同时他对开源界热情的、积极的、无私的奉献精神,让我感动。我们信舟科技SuperBPM平台的诞生,离不开咖啡兔提供的巨大帮助,在此表示感谢。Activiti是一个优秀的项目,让我们能够很容易地将BPM引入我们的企业级应用中,但Activiti毕竟是国外的开源产品,它与国内很多BPM应用还是有些差异的,我们还需要对其做一些必要的个性化扩展和补充,才能用于实际的企业应用。目前国内关于Activiti的专业资料,几乎没有,而《Activiti实战》无疑是目前最佳的入门宝典,书中介绍了很多案例,都是从实际BPM应用中总结的宝贵经验。相信你们将和我一样从中受益,并快速将Activiti集成到自己的企业应用中,让Activiti绽放光芒。北京信舟科技创始人袁启勋

自2010年Tom Bayen离开jBoss加入Afresco公司开发出Activit5以来,在短短几年时间内,国内有大批企事业单位和大型金融机构基于Activiti5来构建各类业务流程系统,那是因为Activiti功能稳定、性能良好,对BPMN 2规范完全支持,在API应用友好性和扩展性方面都有着卓越的表现。我从2010年接触工作流至今已15年,认为Activti5是完全可以与Ultimus、K2等大型商用工作流引擎相媲美的大型开源产品,加上国内有着咖啡兔等众多开源奉献者和非常活跃地社区支持,相信Activiti在国内BPM界会发挥更大地作用和价值。希望这本汇集各种实战经验的书能帮助读者深入了解Activiti。edoc2CTO Robinson

咖啡兔先生,作为Activiti官方源代码的贡献者,也是Activiti国内传道先锋,对Activiti的背景理念、架构设计、开发运维和使用调优等方方面面的认识、理解和感受,无论从深度还是广度上,都是顶级的。有幸与先生合作,创新地提出分布式平台模式,极大地挖掘和扩展了Activiti的功能和使用范围,更为其谦虚大度的为人、高屋建瓴的思路、团队协作的精神、全面扎实的技术等所震惊,如沐春风,受益匪浅。《Activiti实战》作为先生力作,历时一年有余,全面而富有深度地带领大家认识Activiti的世界,强烈推荐!通联支付研发中心技术部总经理王垒前言为什么要写这本书

2011年年末,公司承接了一个保险类的业务系统,包含处理核心业务的ERP系统以及日常办公的OA系统,很明显这两种类型的系统都离不开工作流引擎的支持。我用一周时间对比了几个开源的工作流引擎,最后决定使用Activiti作为整套系统的工作流引擎。

现在回想起来,当初的学习过程是多么的“痛苦”啊!当时Activiti才刚满周岁,除了官方提供的尚能看得过去的用户手册之外,再无其他资料可供参考,这对于国内开发者来说尤为痛苦。仅有的用户手册全部都是英文的,为了学习Activiti只能打开翻译软件硬着头皮把手册看了一遍,当然也离不开打入引擎内部的利器——Javadocs。幸运的是,我的第一份工作(3年时间)是为政府单位开发OA系统,这有助于理解在学习Activiti过程中遇到的一些概念性的内容,在此基础上前后花了一周时间写出了第一个在本书中被讲“烂”掉的请假流程。

国内很多技术爱好者都会使用IM软件或论坛建立技术交流社区,也有一些人开设博客撰写相关技术文章。在开始学习Activiti时,很多人都尝试着去寻找这样的社区,结果由于社区规模小、热度不高,常听到学习资料匮乏以及没有成熟的Demo可供参考这样的声音。我喜欢研究技术也乐于分享,从08年就开始以博客的形式分享一些技术学习心得,在基本掌握Activiti的使用方法后就响应社区的号召在[1]GitHub上公开了Activiti入门Demo项目——kft-activiti-demo,并在个[2]人博客上发布了几篇与Activiti有关的博文。随着国内使用Activiti的企业越来越多,使得Activiti中文社区活跃度大大增加。最初我要花不少时间回答社区中提出的有关Activiti的问题,长此以往,同一个问题每天要回答多次,而且kft-activiti-demo也太过简单,只能作为入门参考,为了能系统地介绍Activiti,就萌发了撰写一本关于Activiti的书籍的想法。

在2012年6月,机械工业出版社华章公司的首席策划杨福川联系我,表示有意向出版一本Activiti方面的书籍。我们一拍即合,于是就有了这本书,这也让我相信机会是留给有准备的人的。这本书原本预计一年完成,不过由于工作与家庭的原因,在2013年一度中断了大半年,导致这本书的难产。在此也对期待已久的读者说声对不起,同时也是因为你们给予的支持与压力促使我最终完成这本书。

在学习和使用Activiti的过程中也遇到了一些Bug或功能缺陷,例如基本上每个初学者都会遇到的流程图中文乱码问题。对于这些问题最初会通过Bug跟踪系统向官方提交问题,在Activiti的源码从SVN切换到GitHub后就可以很方便地让全球的开发者参与进来。笔者也借助GitHub这个平台为Activiti贡献了一些代码,借此机会也呼吁技术爱好者多多参与开源。

读者对象

本书以“理论+实战”的方式引导读者学习,不仅介绍如何使用Activiti,还详细介绍了其遵循的BPMN 2.0规范,所以无论读者是以技术为主还是以业务需求为主,都适合阅读本书。虽然本书中大部分示例都是B/S架构,但不表示Activiti不能在C/S架构中使用。另外,Activiti也不是只针对Java语言的,被其官方定义为BPM平台,借助REST也可以让非Java语言的系统使用Activiti。

适合阅读本书的读者有以下几类:

·Activiti用户和爱好者

·Activiti代码贡献者

·流程引擎相关的项目经理或者需求人员

·Activiti开发者,或运维人员

·使用Activiti开发流程平台的公司

如何阅读本书

本书分为四大部分:

第一部分(第1、2章)为准备篇,介绍整个体系结构及其特点,并为后面的内容配置开发环境。

第二部分(第3、4章)为基础篇,介绍两种流程设计器的使用,以及BPMN 2.0规范。

第三部分(第5~14章)为实战篇,本书中内容最多的部分,该部分以实战为主,包括流程定义、流程实例、任务、子流程、多实例、事件以及监听器等。

第四部分(第15~21章)为高级篇,通过集成各种服务、中间件来阐述Activiti不仅是引擎,更是一个BPM平台,最后还深入源码内部剖析Activiti的设计模式及PVM。

勘误和支持

由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或不准确的地方,恳请读者批评指正。为此,特意创建一个在线支持与应急方案的站点http://www.kafeitu.me/activiti-in-action.html。大家可以将书中的错误发布在Bug勘误表页面中,同时,在遇到任何问题时,你可以访问其Q&A页面,笔者将尽量在线上为你提供最满意的[3]解答。书中的全部源文件除可以从华章网站下载外,还可以从笔者提供的这个网址下载,笔者也会将相应的功能更新及时更正出来。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱yanhonglei@gmail.com,期待能够得到你们的真挚反馈。

致谢

首先要感谢Tom Beayens发起了这么优秀的开源项目,以及Alfresco公司Tijs Rademakers带领的Activiti团队对此项目的无偿贡献与支持。

感谢Activiti中文社区中每一位充满激情的朋友——袁启勋、临远、翔子、姜维、王垒、于广岳、第二少、小股东、陈浩、jackyrong、卖字母为生,以及名单之外的更多朋友,感谢他们长期以来对社区的支持和贡献。

感谢机械工业出版社华章公司的编辑杨福川和姜影,我始终坚信专业的事找专业的人做,两位在这两年的时间中从各个方面支持我的写作,他们的鼓励和帮助引导我顺利完成全部书稿。

感谢我的驴友们,和他们一起登山探险让我精神得以放松,希望以后的空余时间我们继续用双脚丈量大地。

最后感谢我的家人,感谢他们对我的支持和鼓励。

谨以此书献给我最亲爱的家人,以及众多热爱Activiti的朋友们!闫洪磊(咖啡兔)于上海

[1] https://github.com/henryyan/kft-activiti-demo

[2] http://www.kafeitu.me

[3] 参见华章网站www.hzbook.com.——编辑注第一部分 准备篇

工作流(Work Flow)引擎被广泛应用于各种信息化系统中,将原本散乱甚至混乱的业务梳理后制定成业务规范流程,进而约束业务的规范化处理和运转。需求人员、开发人员共同协作制定了符合BPMN 2.0规范的流程定义,之后将其部署到工作流引擎中,由它自动驱动业务流程的进行。

本部分作为准备篇,第1章先介绍了什么是Activiti及其历史背景,然后介绍工作流、BPM、BPMN等概念,使初次接触工作流的读者能快速认识相关概念及各种规范。第2章内容从搭建开发环境开始,之后又介绍了Activiti的Hello World,帮助读者快速入门。第1章 认识Activiti

很多人对工作流(Workflow)应该不陌生。生活中到处都是活生生的“流”:在单位要请假,首先要找领导审批,在领导审批通过之后申请才获准;从网上购物,下单的那一刻就已经触发了一条工作流,此时可以跟踪购物流程,什么时间下单、什么时间付款、什么时候发货、什么时候收到货,在快递单上签字的时候才等于一条工作流程结束了。

工作流应用广泛,在由任务驱动的各种系统中都能见到它的身影,例如,CRM、ERP、ECM、BI、OA等。在企业应用中还有很多产品或平台集成工作流引擎,用来处理系统运行过程中发起的业务流程。

工作流总是以任务(Task)的形式驱动人处理业务或者驱动业务系统自动完成作业。有了工作流引擎之后,我们不必一直等待其他人的工作进度,直白地说,我们只需要关心系统首页的待办任务数即可,由系统提醒当前有多少待办任务需要处理。1.1 什么是Activiti

大家第一次接触Activiti的时候不理解它为什么要叫这个名字,从词典中也没有找到对它的解释。可能有人会想到另外一个单词Activity(活动),与Activiti仅一个字母之差。在工作流方面有些基础的读者或许能很快理解,业务流程由多个环节串联起来并且每个环节被赋予任务,而每个任务又可以分为多个活动。举个日常的例子——网上购物的下单环节,首先需要搜索到要购买的商品,然后将其加入到购物车,最后下单填写邮寄地址并付款。这个例子中的每一动作都可以称为活动(Activity),也就是业务流程中最小的组成部分。多个活动在英文中肯定要用复数形式,即Activities;最后以复数化简的方式标示活动的集合,以此来诠释Activiti与工作流的目的与设计。

此项目是Tom Bayen(jBPM创始人)自2010年离开jBoss加入Alfresco公司后的又一力作:第一版在2010年5月发布,当时仅支持最简单的流程处理,之后的版本陆续完善了对BPMN 2.0规范的支持。

值得一提的是,参与项目开发的除了Tom Bayen和十几位核心开发人员之外,还有其他公司的员工参与,例如,SpringSource、MuleSoft、Salves、Signavio、FuseSource、NextLevel等。

Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台,其核心是使用Java开发的快速、稳定的[1]BPMN2.0流程引擎。Activiti是在ApacheV2许可下发布的,可以运行在任何类型的Java程序中,例如服务器、集群、云服务等。Activiti可以完美地与Spring集成。同时,基于简约思想的设计使Activiti非常轻量级。

Activiti有着活跃的社区,而且越来越多的企业都选择Activiti作为自己的流程引擎或者将其嵌入到自己的系统平台中(例如ESB)。

接下来简单了解一下工作流及其相关规范的历史。

[1] Business Process Modeling Notation,详细信息可参考http://www.bpmn.org/。1.2 工作流基础1.2.1 什么是BPM

BPM是Business Process Management的缩写,中文含义是业务流程管理,是一套达成企业各种业务环节整合的全面管理模式。

BPM是为了实现一定的经营目的而执行的一系列逻辑相关的活动的集合。业务流程的输出是满足市场需要的产品或服务。根据功能、管理范围等的不同,企业流程管理一般分为生产流程层、运作层、计划层和战略层四个层次。BMP是根据业务环境的变化,推进人与人之间、人与系统之间,以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具。

BPM最早是由工作流和企业应用集成(Enterprise Application Intergration)逐步融合而发展起来的,当时是为了满足无纸化办公需求(这也是最早的需求之一)。笔者早期参与OA系统开发时曾经见到过“原始的”工作流——没有工作流引擎,整个流程均使用一系列单独为不同任务节点设计的页面串联起来,完成一个节点后在数据库标记当前任务的名称,以此做到“流程驱动”。

随着时间的推移,BPM的定义范围逐步扩展,不仅用来满足无纸化办公需求,现在BPM是一种企业集成技术,作为对面向服务系统架构SOA(Service-Oriented Architecture)、企业应用集成EAI(Enterprise Application Integration)、企业服务总线ESB(Enterprise Service Bus)的补充。

从概念上来说,BPM包含两个不同方面的意思:管理规范和软件工程。各大BPM供应商长期以来试图抽象这两个不同的方面,但是依然混乱。

作为管理规范,BPM是每一个战略管理者的责任。BPM是组织必须执行的核心业务流程,包含了企业价值和如何提供其实现。作为日常工作的一部分,业务系统可以借助模型和流程规范地定义业务流程。BPM流程图表达的是执行流程的步骤,已完成特定目标。特别说明的是这些模型用于人与人的沟通。这些都是诠释未决的,这意味着它们可以包含更高级别有价值的信息而不包括不必要的细节。这种诠释未决的过程模型也被称为抽象业务流程(Abstract Business Processes.)。

BPM作为软件工程时可以由BPM系统(BPMS)执行可执行的业务流程。可执行的业务流程是在一个流程基础上表示不同的流程顺序。流程图完全可以看做一个抽象的业务流程。可执行流程不同于抽象业务流程,因为它总是以最简单的方式运行。这部分内容也是被大多数厂商认同并接受的。1.2.2 工作流生命周期

一个完整的工作流生命周期会经过5步,并且迭代循环,如图1-1所示。图1-1 完整的工作流生命周期

·定义:工作流生命周期总是从流程定义开始。此阶段的任务主要是收集业务需求并转化为流程定义。一般由业务需求人员进行,然后交由开发人员加工转化为计算机可以识别的流程定义。

·发布:由开发人员打包各种资源,然后在系统管理(平台)中发布流程定义。在具体的流程引擎中包括流程定义文件(bpmn20.xml结尾)、自定义表单、任务监听类。

·执行:具体的流程引擎(例如,Activiti)按照事先定义的流程处理路线以任务驱动的方式执行业务流程。

·监控:此阶段是依赖执行阶段。业务人员在办理任务的同时收集每个任务(Task)的结果,然后根据结果做出相应处理,例如,在采购办公用品流程中,在通过领导审批之后,采购人员就要根据申请单外出采购。

·优化:在此阶段,一个完整的流程已经结束,或许能满足业务需求,或许需要优化,而糟糕的情况是需要重新设计(流程没结束就异常终止),优化与设计正是此阶段需要处理的。根据整个流程的运行过程结果分析问题的根源,然后在此基础上进一步改进,并再次开始一个新的周期。1.2.3 什么是BPMN

Business Process Modeling Notation,简称BPMN,中文译为业务流程建模标注,是由BPMN标准组织发布的,其第一版BPMN 1.0规范于2004年5月发布。经过多年的改进新的规范BPMN 2.0于2011年发布。之后各大厂商、开源社区均基于2.0规范设计自己的流程引擎,结束了各个厂商“各自为政”的局面,相应地统一了标准,从而利于以后的产品迁移。

BPMN定义了业务流程图,其基于流程图技术,同时对创建业务流程操作的图形化模型进行了裁减。业务流程的模型就是图形化对象的网图,包括活动(也可以说工作)和定义操作顺序的流控制。

在BPMN 1.x版本中的一些概念,如人工任务、可以执行脚本、自动决策等,都是独立于供应商的可视化标准化的方式。在BPMN 2.0规范中重点聚焦在如何执行语义和一个被业界认可的通用交换格式。这意味着基于BPMN 2.0的流程建模不仅在流程设计器上可以通用,还可以在任何符合BPMN 2.0规范的流程引擎上执行。

关于BPMN的细节内容有很多,官方文档足足有500多页,本书会在第4章介绍Activiti支持的BPMN 2.0规范以及Activiti在BPMN 2.0规范基础上的扩展。关于BPMN的其他内容本书就不一一列举了,有兴趣的读者可以仔细阅读官方文档。1.3 Activiti的特点

1.数据持久化

Activiti的设计思想是简洁、快速。有过应用开发经验的开发人员都知道应用的瓶颈体现在和数据库交换数据的过程中,针对这一点Activiti选择了使用MyBatis,从而可以通过最优的SQL语句执行Command,仅凭如此就能让引擎在速度上保持最高的性能。

2.引擎Service接口

Activiti引擎提供了七大Service接口,均通过ProcessEngine获取,并且支持链式API编程风格。表1-1简单列出七个Service接口及其作用,具体使用会在后面的章节陆续介绍。表1-1 Activiti引擎的七大Service接口

3.流程设计器

在jBPM4时代有专门的Eclipse插件可以用来设计jPDL,同样Activiti团队也专门设计了用来设计BPMN 2.0规范的流程设计器——Eclipse Designer。此外还有Signavio公司为Activiti定制的基于Web的Activiti Modeler流程设计器。

4.原生支持Spring

Activiti原生支持Spring,这一点对企业应用来说尤为重要:可以很轻松地进行Spring集成,非常方便管理事务和解析表达式(Expression)。

5.分离运行时与历史数据

Activiti继承自jBPM4,在表结构设计方面也遵循运行时与历史数据的分离,这样的设计可以快速读取运行时数据,仅当需要查询历史数据时再从专门的历史数据表中读取。这种设计方式可以大幅提高数据的存取效率,尤其是当数据日积月累时依然能够快速反应。1.4 Activiti的应用

目前Activiti在国外已被很多厂商所使用,甚至有人专门成立了公司来培训Activiti的使用。Activiti在国内的发展正在呈直线趋势上升,已经成立了由很多热心的技术爱好者参与的技术社区。目前,很多新项目、新产品都开始采用Activiti作为新一代工作流引擎。

1.在系统集成方面应用

·与ESB(Enterprise Service Bus,企业服务总线)整合,例如Mule。

·与规则引擎(Rule Engine)整合,例如JBoss Drools。

·嵌入已有系统平台,例如,很多公司都开发了自己的系统平台,在其中嵌入Activiti作为平台的一部分。

2.在其他产品中应用[1]

Alfresco公司的ECM(Enterprise Content Management)产品Alfresco在企业中应用广泛,主要涉及文档管理、协作、记录管理、知识库管理、Web内容管理等。

如果企业或客户正在使用Alfresco管理文档,那么针对文档管理流程设计的流程定义可以直接部署在Alfresco上使用;如果之前没有接触过jBPM而现在学会了使用Activiti,那么不用再去学习其他的流程引擎。关于Activiti与jBPM的区别在1.6节会提到。

在Activiti没有发布之前一直使用jBPM作为流程引擎,在Activiti成熟以后Alfresco同时支持两者,当然在以后的某个时间可能会取消对jBPM的支持。

[1] http://www.alfresco.com/1.5 Activiti架构与组件

Activiti架构中最重要的肯定是引擎,当然还有刚刚提到的外部工具和组件,如图1-2所示。图1-2 Activiti架构图

下面依次介绍Activiti架构图中的各个组件。

·Activiti Engine:作为最核心的模块,提供针对BPMN 2.0规范的解析、执行、创建、管理(任务、流程实例)、查询历史记录并根据结果生成报表。

·Activiti Modeler:是模型设计器,其并非由Activiti公司所开发,[1]而是由业界认可的Signavio公司赠送的(Signavio原本是收费的产品,现在被免费授权给Activiti用户使用)。适用于业务人员把需求转换为规范流程定义。

·Activiti Designer:功能和Activiti Modeler类似,同样提供了基于BPMN 2.0规范的可视化设计功能,但是目前还没有完全支持BPMN规范的定义。适用于开发人员,可以把业务需求人员用Signavio设计的流程定义(XML格式)导入到Designer中,从而让开发人员将其进一步加工成为可以运行的流程定义。

·Activiti Explorer:可以用来管理仓库、用户、组,启动流程、任务办理等。此组件使用REST风格API(目的在于让开发人员快速入门),提供一个基础的设计模型。如果业务简单,也可以直接使用无需开发。还可以作为后台管理员的流程、任务管理系统使用。

·Activiti REST:提供Restful风格的服务,允许客户端以JSON的方式与引擎的REST API交互,通用的协议具有跨平台、跨语言的特性。

[1] http://www.signavio.com/en.html1.6 Activiti与jBPM5比较

目前流行的工作流引擎有Activiti和jBPM5,而在jBPM5发布以前大多数项目、平台都是基于jBPM3、jBPM4开发的。本节内容从技术和实际应用上对Activiti和jBPM5进行比较。表1-2从技术层面比较了两者的区别。表1-2 Activiti与jBPM5的技术层面对比

Activiti是基于jBPM4设计的衍生版本,如果选择Activiti可以继续沿用jBPM的思想理念设计、整合Activiti到项目或平台中,这也是相对于jBPM5来说的一个优势;相反,对于jBPM5来说要花点时间重新接受开发者的设计思想。

在各个流程引擎社区中有很多关于该如何选择Activiti和jBPM5的讨论,这两者有着很多相似的地方,争论主要是对规则引擎的支持:jBPM5是基于Drool Flow所有自然深度继承而来的规则引擎Drools;早期的Activiti功能比较简单,后来陆续添加的新特性也支持规则引擎Drools,开发人员只要简单配置规则接口即可达到与jBPM5一样的效果。1.7 本章小结

本章内容主要是以初识工作流和Activiti的角度去讲解什么是工作流、什么是Activiti。从Activiti项目的发起、特点、应用、架构,以及与其他同类产品比较的角度在概念层给读者一个引导和认识。

作为一个开发人员,能够知道为什么需要学习Activiti,Activiti能帮助企业解决什么问题,为什么要选择Activiti而不是其他的工作流引擎。

看到这里你或许会不耐烦了,会想起一句话:“Talk is [1]cheap.Show me the code”。下一章将带领你体验Activiti的Hello World。

[1] 这是Linux的作者Linus Torvalds的名言,意思是:能说算不上什么,有本事就把你的代码给我看看。第2章 搭建Activiti开发环境

第1章介绍了关于工作流的概念及Activiti的发起背景,带领大家大体了解Activiti能帮助企业解决什么问题,作为一个开发人员为什么需要学习Activiti,还简单介绍了一下Activiti的架构以及与其他工作流引擎的区别。本章将带领你一步一步搭建开发环境,并运行期待已久的Hello World程序。2.1 下载Activiti

通过浏览器访问页面:http://activiti.org/download.html,其中列出自Activiti发布以来历次版本的压缩包和相关文档(10分钟入门、用户手册以及JavaDoc)。

在“Latest Release”处下载下面的压缩包,在笔者写作本书时最新版本为Activiti 5.9。细心的读者可能注意到:在“Older releases”的发布列表中5.6版本之前基本上是一个月发布一版,从5.6版本之后基本固定为2~3个月发布一版。说明 初学者很难理解的地方是:为什么Activiti的版本从5.0开始?在第1章的内容中提到过Activiti是基于jBPM4开发的,所以就直接版本号累加,最终从5.0版本开始。2.1.1 目录结构

在最初撰写本章内容时最新的版本为5.9,目录结构和下一版本(5.10)一致;但是从5.11版本开始发生了比较大的变化,所以分两个小部分说明两者在目录结构上的不同。本书完稿时最新版本为5.16.3。

1.5.10及之前的版本

对于Activiti 5.10及之前的版本,解压压缩包之后目录结构如图2-1所示。

下面我们来详细介绍图2-1中的目录结构。

·docs,该目录包含了三种文档:javadocs、userguide、xsd。*

·javadocs:包名按照功能模块划分,org.activiti.engine.,接下来在2.1.2节中详细介绍。

·userguide:用户手册,包含环境配置、10分钟快速入门,以及各个功能模块的使用教程。

·xsd:包含BPMN 2.0规范的XSD文件,以及Activiti扩展的自定义标签XSD。

·setup:用来构建、启动Activiti Explorer演示程序。通过ant demo.start命令即可自动下载tomcat,配置数据库,最后打开浏览器访问应用。具体操作将在2.4节详细介绍。

·workspace:该目录包含了各种应用的实例程序,都以单元测试的形式展示功能的使用方式。读者可以直接将项目导入Eclipse查看其源代码,从而通过断点调试来学习。图2-1 Activiti 5.10及之前版本的目录结构

2.5.11及之后的版本

对于Activiti 5.11及之后的版本,解压压缩包之后目录结构如图2-2所示。

下面我们来详细介绍图2-2中的目录结构。

·Database,该目录包含了针对Activiti引擎表的创建(create)、删除(drop)及版本升级(upgrade)三种类型的脚本:创建、删除类型的脚本以“activiti.oracle.[create|drop].[identity|engine|history].sql”这样的结构命名SQL脚本文件;升级脚本以“activiti.oracle.upgradestep.[5x].to.[5(x+1)].history”的结构命名SQL脚本文件,其中“x”表示小版本号。

·docs,该目录也包含了三种文档:javadocs、userguide、xsd。

·javadocs:包名按照功能模块划分,org.activiti.engine.*,接下来在2.1.2节中详细介绍。

·userguide:用户手册,包含环境配置、10分钟快速入门,以及各个功能模块的使用教程。

·xsd:包含与流程定义相关的scheme,例如,BPMN 2.0、BPMNDI及Activiti在BPMN 2.0规范上扩展的元素。

·libs:相比5.10之前的版本移除了第三方的依赖,仅仅包含了Activiti引擎的各个模块(engine、bpmn-converter、bpmn-model、camel、cdi、cxf、json-converter、modeler、mule、osgi、rest、spring)的class文件以及源码。这么做的目的是通过Maven管理依赖(在2.3.2节介绍了如何使用Maven管理依赖)避免因Jar版本不同导致冲突(大部分开源项目及国外的项目都使用Maven管理依赖,所以强烈建议没接触过Maven的读者花点时间学习使用它)。

·wars:从5.11版本开始对explorer模块和rest模块进行了拆分,使得rest模块可以独立运行;运行explorer的方式也随之发生了变化,不再使用ant脚本(2.5.1节)运行,而是提供一个独立的war包,自行部署tomcat或jboss等Web服务器中。图2-2 Activiti 5.11及之后版本的目录结构2.1.2 Javadocs

Javadocs是开发人员与Activiti交流的“语言”,在开始编写第一个Hello World之前先来大致了解一下每个包(也就是module)的功能及各个接口的作用。当然不太想了解这些内容的读者也可以暂时跳过这里,直接开始搭建环境并编写第一个Hello World程序,最后再回过头来了解。

Javadocs一共包含11个package,下面依次介绍它们的作用范围。

1)org.activiti.engine:包含上一章提到的七大类Service接口、异常类定义和流程引擎(Process Engine)及流程引擎配置(Process Engine Configuration),另外还定义了一些运行时(Runtime)异常类。

2)org.activiti.engine.delegate:该包定义了处理流程的行为、监听事件的规范。在实际应用中可以在流程定义中配置实现了监听接口的类处理业务逻辑,例如可以在流程结束时由系统自动归档。在第1章中提到过Activiti使用的是监听者(Observer)模式,在流程运行过程中(任务完成)引擎会遍历注册的监听并依次调用。

3)org.activiti.engine.form:该包应用在内置表单的场景下,在一些企业或客户要求自定义表单的需求中使用。定义表单有两种方式:第一种是直接在流程定义中设置每个节点的表单内容,可以设置每个字段(Field)的类型、是否可以编辑等属性;另外一种就是通过外置表单的形式,通过formkey指定外置表单文件的名称,类型可以是.xml或.form。表单的读取、提交均可以通过FormService接口完成。

4)org.activiti.engine.history:该包包含了历史记录查询对象及查询结果的历史数据对象接口。可以查询历史流程实例(HistoricProcessInstance)、历史任务(HistoricTask)、历史活动(HistoricActivity)、历史详细(HistoricDetail)等。在13.3节中,流程跟踪功能就是通过HistoryService接口进行查询来实现的。

5)org.activiti.engine.identity:该包可以用来管理身份和认证,功能依托IdentityService接口。在这里需要说明一下,Activiti有自己的Identify模块,因为流程中的用户任务(userTask)需要指派给某个人或某个角色。关于任务指派在后面12.1.3节会介绍。讲到这里顺便提一下,关于身份认证管理功能和企业中已有身份认证管理模块的冲突解决办法将在第19章中详细讨论。

6)org.activiti.engine.management:该包主要是用来实现针对流程引擎的管理功能,通过调用接口ManagementService可以监控引擎状态、任务调度、数据库数据读取。

7)org.activiti.engine.query:该包没有具体的功能,定义了查询的共有特性。细心的读者在查看API的时候会发现XxxQuery接口均继承自Query,并且使用了JDK 5提供的泛型。

8)org.activiti.engine.repository:该包包含了针对流程资源的管理与查询。依托RepositoryService接口可以部署流程定义、自定义表单、规则等文件,还可以读取流程图片、流程定义(bpmn20.xml)文件。

9)org.activiti.engine.runtime:在第1章中提到了Activiti把流程数据划分为两种:运行时数据和历史数据。刚刚介绍了org.activiti.engine.history包依托HistoryService查询历史数据,相应地,也可以通过RuntimeService接口查询运行时数据,例如可以查询出当前用户的待签收任务、待处理任务,以及正在处理中的流程实例对象。当然除了查询数据之外还要启动流程,然后得到实现了ProcessInstance接口的实例,从而在业务中根据流程实例继续处理业务信息。另外在Activiti 5.9版本中添加了对流程定义状态的控制功能:挂起和恢复。

10)org.activiti.engine.task:该包包含任务对象的定义,依托TaskService接口可以对任务(Task)全面管理,例如,任务创建、删除、任务指派、批注管理、附件管理以及变量查询。在12章将会逐一介绍TaskService操控Task。

11)org.activiti.engine.test:顾名思义,该包针对快速创建测试用例提供基类和注解(Annotation)。现在已经有很多公司或开发人员使用测试驱动(Test Driven Development,TDD)方式编码,Activiti提供的这一功能大大方便了验证流程定义中业务逻辑正确与否的效率。此包不仅提供了测试基类,还支持注解(Annotation)方式自动部署流程定义。本书的很多示例也将先以TDD方式引导读者学习。2.2 环境配置检查

在准备搭建开发环境之前需要读者检查自己的系统环境是否已安装JDK、Ant和Maven,如果已经安装,那么需要检查版本是否满足Activiti的最低要求。2.2.1 检查并安装JDK

在Activiti 5.10版本之前要求JDK的最低版本为JDK 1.5(即5.0),从Activiti 5.11版本开始要求最低JDK为1.6(即6.0);如果本地配置低于不同版本的最低要求,那么需要到Oracle官方下载(http://www.oracle.com/technetwork/java/javase/downloads/index.html)并安装。

在检查JDK前先确认JAVA_HOME已正确设置。

1)Windows用户:

C:\Documents and Settings\henryyan>>echo%JAVA_HOME%

C:\Documents and Settings\henryyan>>java-version

2)Linux、Mac OS用户:

henryyan@hy-hp~echo$JAVA_HOME

henryyan@hy-hp~java-version

笔者的Java环境如图2-3所示。图2-3 在Linux系统中安装配置Java环境2.2.2 检查并安装Ant

Activiti Explorer在1.5节已经提到了,可以快速运行示例程序。示例程序需要使用Ant构建运行。

官方要求Ant的版本为1.8.1或更高,如果本地没有Ant安装软件,那么先从Apache网站下载(http://ant.apache.org/bindownload.cgi),然后将其解压并安装到本地目录。

检查Ant前先确认ANT_HOME是否已正确设置。

1)Windows用户:

C:\Documents and Settings\henryyan>echo%ANT_HOME%

C:\Documents and Settings\henryyan>ant-version

2)Linux、MacOS用户:

henryyan@hy-hp~echo$ANT_HOME

henryyan@hy-hp~ant-version

笔者的Ant环境如图2-4所示。图2-4 在Linux系统中安装配置Ant环境2.2.3 检查并安装Maven

Maven作为一款优秀的构建工具(不仅仅是构建)已经被全球很多的开发者、开源组织使用,近年来也被国内越来越多的公司和组织使用。未接触Maven或不太熟悉相关内容的读者可以参考国内Maven[1]专家许晓斌著的《Maven实战》。

Activiti引擎的源码也是使用Maven构建的,并且公开Maven仓库方便开发者下载引擎。本书所有示例程序都将使用Maven管理依赖,所以读者一定要检查Maven的配置是否正确。

如果还未安装Maven,那么先从Apache网站下载(http://maven.apache.org/download.html),然后将其解压到本地目录。

检查Maven前要先确认MVN_HOME是否设置。

1)Windows用户:

C:\Documents and Settings\henryyan>echo%MVN_HOME%

C:\Documents and Settings\henryyan>mvn-v

2)Linux、Mac OS用户:

henryyan@hy-hp~echo$MVN_HOME

henryyan@hy-hp~mvn-v

笔者的Maven环境如图2-5所示。图2-5 在Linux系统中安装配置Maven环境

[1] http://www.juvenxu.com/mvn-in-action2.3 配置文件介绍

本节来介绍两个配置文件,一个是Maven的pom.xml文件,另外一个就是Activiti的默认配置文件activiti.cfg.xml。2.3.1 Activiti配置文件

在bpmn20-example工程的src/test/resources中有一个activiti.cfg.xml文件,此文件就是Activiti的配置文件,用来定义引擎初始化参数、bean、邮件服务器及各种监听器。

代码清单2-1展示了一个标准的Activiti配置文件。

代码清单2-1 标准的Activiti配置文件 #2 #3-S #3-E

在第1章中提到过Activiti和Spring无缝集成,熟悉Spring的读者一眼就看出来这就是Spring的配置文件。是的,在XML的命名空间中定义了spring-bean,即http://www.springframework.org/schema/beans。

#1处定义了一个id为processEngineConfiguration的bean对象,其中processEngine-Configuration即为Activiti默认的引擎配置管理器名称。

#2处指定了一个具体的Java类,由Spring负责实例化引擎配置管理器并注入#3处的一系列配置参数。此处的引擎配置管理器是基于内存数据库的,因为其速度快,常用于测试环境。

#3处的配置参数含义如表2-1所示。表2-1 Activiti引擎配置管理器的参数及其含义2.3.2 Maven配置文件

讲解Maven配置文件主要是针对没有接触过Maven或对Maven不太熟悉的读者。

打开bpmn20-example中的pom.xml查看文件内容。下面以代码片段的形式说明Maven配置文件的作用。

要在Maven项目中使用一个依赖只需要声明groupId、artifactId、version三个属性即可,具体的XML如下: org.activiti activiti-engine ${activiti.version}

其中:

·groupId,一般以公司或组织的域名倒序定义;

·artifactId,一个组件的ID标识;

·version,依赖的版本,此处用一个占位符代替实际的版本号。

version标签中的${activiti.version}表达式可以在properties标签中定义属性的值,如下: 5.10

通过指定activiti.version为5.10,Maven就知道需要从仓库下载版本为5.10的Activiti对应的jar文件,还可以下载依赖组件的javadocs或sources等。

Maven在需要下载依赖的时候默认从中央仓库搜索,当匹配到存在的组件时将其从远程下载到本地仓库。但是,当中央仓库不存在某个组件的时候就需要定义第三方仓库供Maven查询、下载。目前Activiti还未被收录到中央仓库,所以我们需要指定一个第三方仓库,即Activiti提供的仓库,告诉Maven当找不到依赖时从此仓库查询。以下代码定义了Activiti的公开仓库(从5.14版本开始,可以从Maven中央仓库直接下载): Activiti http://maven.alfresco.com/nexus/content/repositories/activiti

以此类推,当日常开发中遇到某些依赖组件不存在的情况时,可以先查看官方网站是否提供了Maven仓库,如果有则加入到repositories中,否则只能用私服的方式(私服如何使用不在本书讨论范围内,读者可以参考《Maven实战》一书)。2.4 Hello World

Hello World如此经典,几乎每学习一门新技术都从它开始,它是[1]一把打开技术之门的万能钥匙,因为通过Hello World能快速了解一门技术如何配置、运行,以及得到什么样的结果。

好吧,让我们一起开启探索Activiti的大门。2.4.1 最简单的流程定义

代码清单2-2是一个最简单的请假流程定义文件,简单到仅有开始节点和结束节点。

代码清单2-2 最简单的请假流程定义文件leave.bpmn #1-E #2 #3 #4

在解释这个文件的内容之前我们先来了解一下为了更好地理解代码含义本书所做的一些约定。说明 #号后面加数字用来表示代码清单的第几处(不是行号),其中1-S和1-E分别代表第1处标记的开始(Start)和结束(End)。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载