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。
m javadocs:包名按照功能模块划分,org.activiti.engine.*,接下来在2.1.2节中详细介绍。
m userguide:用户手册,包含环境配置、10分钟快速入门,以及各个功能模块的使用教程。
m xsd:包含BPMN 2.0规范的XSD文件,以及Activiti扩展的自定义标签XSD。
setup:用来构建、启动Activiti Explorer演示程序。通过ant demo.start命令即可自动下载tomcat,配置数据库,最后打开浏览器访问应用。具体操作将在2.4节详细介绍。
workspace:该目录包含了各种应用的实例程序,都以单元测试的形式展示功能的使用方式。读者可以直接将项目导入Eclipse查看其源代码,从而通过断点调试来学习。
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。
m javadocs:包名按照功能模块划分,org.activiti.engine.*,接下来在2.1.2节中详细介绍。
m userguide:用户手册,包含环境配置、10分钟快速入门,以及各个功能模块的使用教程。
m 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.1.2Javadocs
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方式引导读者学习。