看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分钟例子,简单测试下,

参考: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条数据

activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑的更多相关文章

  1. 试试 IEnumerable 的 10 个小例子

    IEnumerable 接口是 C# 开发过程中非常重要的接口,对于其特性和用法的了解是十分必要的.本文将通过10个小例子,来熟悉一下其简单的用法. 全是源码 以下便是这10个小例子,响应的说明均标记 ...

  2. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  3. 10分钟学会Less开发环境搭建与初体验

    Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题.扩充. 今天看一下,10分钟能不能手把手快速教会你Le ...

  4. js中的变量小例子

    s中的变量function foo(){ n=99;}alert(n);//undefined,因为没有调用该函数 function foo(){ n=99;}foo();alert(n);//99, ...

  5. 每天2个android小例子----简单计算器源代码

    通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局 package com.android.xiong.gridlayoutTest; import java.mat ...

  6. Python学习中的一些小例子

    这篇文章包括用Python编写的斐波那契数列,三位数的水仙花数和百钱买百鸡的基础代码 斐波那契数列: ''' def hanshu(n): n_1 = 1 n_2 = 1 m = n sumn = 0 ...

  7. C#扩展方法的一分钟小例子

    扩展方法是静态方法,是类的一部分,但没有在类的源代码中,就像一个补丁 首先创建一个静态类,然后创建一个静态方法,重点是静态方法的参数 public static class xExtension { ...

  8. 10分钟.Net Core 简单入门教程

    以 Centos 为例 1.安装所需的依赖关系 打开命令提示符并运行以下命令: sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/p ...

  9. Python 中class的小例子

    class Song(): def __init__(self,lyrics): self.lyrics=lyrics def sing_a_song(self): for line in self. ...

随机推荐

  1. js实现60秒倒计时效果(使用了jQuery)

    今天碰到要实现一个类似那种短信验证码60秒倒计时的需求,好久不写js,有点手生.把代码记录下,方便后续查阅. 这里我用了jQuey,毕竟写起来简洁点.下面直接看效果和代码. 一.效果          ...

  2. POJ1159

    这竟然是IOI虽然是2000年的,但其实也改变不了它水题的本质 我写了两种方法,这里都讲一下吧 考虑记忆化搜索,用f[i][j]表示当区间的左端为i,右端为j时最少要添加多少字符,所以ans就为f[1 ...

  3. 汇编 MOVSX与MOVZX 指令

    知识点:  MOVSX符号扩展传送  MOVZX零扩展传送 一.MOVSX与MOVZX格式 MOVSX 操作数A ,操作数B MOVZX 操作数A ,操作数B 相同点:操作数B 空间必须小于 操作 ...

  4. python 算法面试题

    1.题目是:有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法. def StringSort(data): startIndex=0 endIndex=0 count ...

  5. .Net单元测试业务实践

    使用次数和允许取消次数单元测试实践 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ code[ ...

  6. Asp.net中汉字转换成为拼音

    1.应用场景 将汉字转换为拼音(eg:"我爱你"--->"WOAINI") 取各个汉字的首字母(eg:"我是中国人"--->&q ...

  7. Python中浅拷贝和深拷贝的区别总结与理解

    单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...

  8. 2014.9.11 Research Meeting Report

    Dear All: Yesterday when we read INFOCOM papers, you have seen how damage it is to have careless wri ...

  9. RPG游戏开发基础教程

    RPG游戏开发基础教程 第一步 下载RPG Maker 开发工具包 1.RPG Maker 是什么? RPG Maker 是由Enterbrain公司推出的RPG制作工具. 中文译名为RPG制作大师. ...

  10. cocos2d-x学习之路(二)——分析AppDelegate和HelloWorldScene文件

    这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础. 这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然 ...