activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑
看mossle的 5.16 用户手册中的 快速起步:10分钟教程
想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来。
首先官网下载最新的 5版本 full Guide
方法如下:
百度搜索 activiti,点
往下拉页面,
点 no thanks continue,跳转页面到:
往下拉页面,找到
点 5.x Full Guide连接,点进去
点图中红框部分下载。
==============================
下载解压后,得到这个目录:
目录简介:
1) database:里面存放的是Activiti使用到的数据库信息的sql文件,使用时只需执行你自己的数据库类型的文件即可。如:你的数据库是MySQL,那么就执行activiti.mysql.create.*.sql即可。
2) docs:毫无疑问,api文档是也【但是这个api貌似都是英文的,如果英文不好,还是建议看中文版本: http://www.mossle.com/docs/activiti/index.html】。
3) libs:使用Activiti所需要的所有的jar包和源文件。
4) wars:官方给我们提供的示例Demo,通过使用Demo可以更加快速的了解Activiti【还可以用这个项目直接画xml流程图,避免了在编辑器 如eclipse中安装activiti流程图绘制插件】。
================
将其中的 wars目录中的
放到本地tomcat下,我用的是7版本,
然后直接启动,就可以了通过如下地址访问了:
可以参考
Activity工作流(2)-入门安装运行第一个例子
这里需要说明的就是,这个Demo默认采用的是h2内存数据库,如果想用你自己的数据库,就需要修改web应用WEB-INF/classes目录下的db.properties。然后,按上面说的,把database里的create文件夹里的数据库文件导入你自己的数据库。
改为MySQL数据库具体方法:
这里用哪个库都行,但是为了后面的代码演示,我们将上面项目的库改为mysql,
首先在本地电脑上,创建一个mysql数据库,名字随意,我这里叫 activiti1
然后,在刚才下载的目录下找到
在我们自己创建的数据库里执行上面框住的3个脚本,数据库中就有表了。
然后,
修改tomcat下项目中的数据库配置:
再重启tomcat,就会用我们本地的tomcat数据库了。
然后就可以根据以下文章,操作一遍这个官方项目了:
Activiti工作流的应用示例
=================================================================
下面我们用代码方式创建,也就是根据 5.16中文用户手册上的 10分钟例子,简单测试下,
但是这里我们的项目中不用Spring,不用安装Eclipse的activiti流程图插件(此插件及其难装,而且我觉得还不如直接在上面的官方项目中画流程图,再导出来好用)
因为不想用spring,所以 我们创建一个 maven的jar项目:
这个项目中,首先是 pom文件中要引入 activiti的jar包,和mysql的连接jar包:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.my</groupId> <artifactId>activitiTest</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- Activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <!-- <version>5.15.1</version> --> <version>5.22.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-explorer</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.29</version> </dependency> </dependencies> </project>
可以看到,整个pom文件中只需要 activiti的jar包和 mysql的连接包,非常简单。
=====================
第一个坑出现了:
就是pom中的 activiti 版本
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<!-- <version>5.15.1</version> -->
<version>5.22.0</version>
</dependency>
注意:这个版本一定要和我们数据库中的 act_ge_property 表
中数据版本一致:
否则一会运行代码就会报如下异常:
可以参考:
Could not update Activiti database schema: unknown version from database: '5.20.0.1'
==============================================
配置好pom,就要配置代码需要访问的数据库,为了后面测试,我们要让代码的数据库和我们之前下载好的官方guide项目中的数据库使用同一个。
而我们代码因为没有用spring集成,所以不能直接用 db.properties,而是要 一个
activiti.cfg.xml 配置文件。
配置文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti1?characterEncoding=utf-8" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="123" /> <property name="databaseSchemaUpdate" value="true" /> </bean> </beans>
这里面就是配我们本地的那个数据库。
手册中的创建ProcessEngine部分有这个配置文件的内容:
还可以参考文章:
(activiti入门列子一个简单的activiti请假流程) 或
我的第一个activiti实例
=====================================================
然后可以创建一个类,编写java代码:
【注意:这个类中,创建 ProcessEngine 对象,不要用手册中10分钟例子那的那个方法,而是要用 getDefaultProcessEngine() 这个方法,这样才会用我们本地的activiti.cfg.xml数据库配置 】
package activitiTest; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; public class T1 { public static void main(String[] args) { // Create Activiti process engine 这个是用spring集成时用的,如果不用spring则用下面的getDefaultProcessEngine // ProcessEngine processEngine = ProcessEngineConfiguration // .createStandaloneProcessEngineConfiguration() // .buildProcessEngine(); ///用这个方法,才会去加载 activiti.cfg.xml 配置文件中配置的数据库 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // Get Activiti services RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // Deploy the process definition repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess1.bpmn20.xml") .deploy(); // Start a process instance runtimeService.startProcessInstanceByKey("financialReport"); } }
然后我们就可以继续根据官网的 10分钟教程,编写 xml 流程文件了,这时要,注意:
官方手册中给出了一个财务月报提交审批的流程的xml,说是为了熟悉流程需要手工编写,直接把那个流程拿过来放到我们项目的resouce目录下用Eclipse用我们刚才的T1代码运行是可以的【也就是说,如果只是需要在Eclipse中运行项目,我们只需要用上面的xml即可,根本不用其他任何activiti额外的流程配置】
坑:
但是,如果你想额外测试,将这个复制过来的“手写xml”导入到我们官网下的guide项目中是不行的,因为其缺少了 bpmn图像信息,会报错如下:
当然,用户手册 10分钟例子处,在这个 “手写流程xml”下面 还有一个连接,说是可以下载带bpmn图像信息的 xml,是可以下载的,而且其中也确实包含bpmn元素,但是,你下载下来,往tomcat项目中导入,还是会报错:
不止如此,如果你直接把它放在Eclipse中resource目录下,运行我们的T1代码,发现会直接报错:
其实原因是,用户手册中提供的 xml 虽然包含了图像元素信息,但是却缺少了bpmn图像元素标签相关的头约束定义,所以Eclipse解析xml时会报错,官网guide项目无法导入也是同样原因。解决办法就是加入相关头约束,但是这个头约束在哪里找呢?
不用在网上找,只需要在官网guide项目中随便画一个流程图(或者用已存在的流程图)导出到本地,然后用编辑器打开,就会发现,人家官网项目导出的xml中包含的头是全的,我们只需要把其复制到我们手写的 xml中即可。
下面是我添加好头部约束定义,即各种注释的 手写 财务月报流程xml:
FinancialReportProcess1.bpmn20.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义开始 --> <!-- 下面3行是头文件,如果包含 bpmndi:BPMNDiagram 标签则不能只用这3行,要用下面那个多的 --> <!-- <definitions id="definitions" xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="Examples"> --> <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="financialReport" name="Monthly financial report reminder process"> <!-- 开始事件 --> <startEvent id="theStart"></startEvent> <!-- 从开始到第一个用户任务之间的箭头连线(会包含定义箭头起始点对应的节点 id) --> <sequenceFlow id="flow1" targetRef="writeReportTask" sourceRef="theStart"></sequenceFlow> <!-- 第一个用户任务(写月财报) --> <userTask id="writeReportTask" name="Write monthly financial report"> <!-- 描述信息,可有可无 (各个标签上的name属性也是同理) --> <documentation> write monthly finacial reoport for publication to sharehollders. </documentation> <!-- 潜在拥有者 --> <potentialOwner> <!-- 资源分配表达式 --> <resourceAssignmentExpression> <!-- 真正的表达式 --> <formalExpression> <!-- 没有显示指明是用户还是组,默认为组,这里是之会计组的成员 --> accountancy </formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <!-- 从第一个用户任务到第二个用户任务之间的箭头连线(会包含定义箭头起始点对应的节点 id) --> <sequenceFlow id="flow2" targetRef="verifyReportTask" sourceRef="writeReportTask"></sequenceFlow> <!-- 第二个用户任务(领导审批任务) --> <userTask id="verifyReportTask" name="Verigy monthly financial report"> <documentation> Verify monthly financial report composed by the accountancy department. This financial report is going to be sent to all the company shareholders. </documentation> <potentialOwner> <resourceAssignmentExpression> <!-- 这个任务的潜在用户是管理组成员 --> <formalExpression>management</formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask> <!-- 第二个用户任务到结束节点的箭头连线 --> <sequenceFlow id="flow3" targetRef="theEnd" sourceRef="verifyReportTask"></sequenceFlow> <!-- 结束事件节点 --> <endEvent id="theEnd"></endEvent> </process> <!-- 下面是用编辑器画流程图时生成的图像信息,在Eclipse中用代码方式可以把下面的都注释 --> <bpmndi:BPMNDiagram> <bpmndi:BPMNPlane bpmnElement="financialReport"> <bpmndi:BPMNShape bpmnElement="theStart"> <omgdc:Bounds height="30.0" width="30.0" x="75.0" y="225.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="writeReportTask"> <omgdc:Bounds height="80.0" width="100.0" x="165.0" y="200.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="verifyReportTask"> <omgdc:Bounds height="80.0" width="100.0" x="330.0" y="200.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="theEnd"> <omgdc:Bounds height="28.0" width="28.0" x="480.0" y="226.0" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1"> <omgdi:waypoint x="105.0" y="240.0" /> <omgdi:waypoint x="165.0" y="240.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2"> <omgdi:waypoint x="265.0" y="240.0" /> <omgdi:waypoint x="330.0" y="240.0" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3"> <omgdi:waypoint x="430.0" y="240.0" /> <omgdi:waypoint x="480.0" y="240.0" /> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
(上面这个xml不仅在Eclipse执行没有问题,甚至还可以直接导入到官方项目中)
这时,我们的项目就搭建完成了,就可以按照用户手册 10分钟教程中的流程继续学习了,比如 用T1代码创建并部署、启动流程后,在官方项目中通过浏览器查看启动好的财务月报流程,并进行任务领取,执行等各种操作【因为他们共有同一个数据库,而activiti最大的特点就是几乎所有与activiti相关的内容都是保存在数据库中持久化的】。
=============
我们使用官方guide时还要注意,每次一个用户进行流程相关操作后,如果想让另一个流程相关用户登录的信息发生变化,通常需要另一个用户先注销(退出)再重新登录,信息才会同步显示,同理如果我们用eclipse代码进行流程操作后,在guide项目中也需要用户注销再重新登录才会数据同步更新显示。
================
其他知识:
摘自: activiti入门列子一个简单的activiti请假流程
通过ProcessEngines.getDefaultProcessEngine获取流程引擎
//通过activiti.cfg.xml获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
通过源码可以看到 getDefaultProcessEngine方法会通过默认的activiti.cfg.xml文件名或者是activiti-context.xml文件名读取xml文件
当获取到的processEngine对象不为空时 就会在数据库创建关于activiti的23张表
具体作用如下:
更详细的情况可以去下面这个地址了解:
http://www.cnblogs.com/llzgzljl/archive/2013/10/07/3356108.html
此时你可以在数据库中看到act_ge_property表中插入了3条数据