一、前言

  

  最近在做公司的OA,里面有用到工作流,公司用的是 jbpm4,感觉比较老,资料有点少,就先学学 新一点的 activiti  ㄟ(▔▽▔)ㄏ

  首先工作流的概念是:工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

  比如请假可以看做一个流程,首先需要项目经理审批,项目经历审批完了就部门经理审批,要是你请假的天数有点长还得更上一级的人审批。假如我们要自己实现的话得设计几张表,然后原来的表里面还要加字段来记录状态,流程要变的话就更是要命。所以就有了工作流,activiti就属于工作流的一种实现,  它帮你把通用的东西搭建好,然后提供接口给你。(好像框架都是这样~)

  activiti的实现方式也和我们自己实现一样:建表,在表里面存储流程相关的数据,不过它设计的表是通用的,并且提供好了非常简单好用的接口给我们,让我们根本就不用和数据库打交道。

    二、准备工作

  

  1、既然是框架,那就得有jar包

    这里我提供了activiti5的jar包,直接访问链接就可以下载

    http://files.cnblogs.com/files/summertime-wu/activiti-lib1.zip

    http://files.cnblogs.com/files/summertime-wu/activiti-lib1.zip

    分两次上传了,因为博客园不允许一次上传超过10兆的东西 (*▔^▔*)

  2、作为一个框架的尊严,当然得有配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 流程引擎配置对象 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti_day1"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean> <!-- 使用工厂创建流程引擎对象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>

  关于这个流程引擎对象后面有解释,流程引擎工厂看名字就知道ㄟ(▔,▔)ㄏ

  3、安装eclipse插件

  Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。 我们下面来安装这个插件

  

  

  

  

  

  然后选Activiti Diagram,就可以新建一个流程图文件

  总的来说这个插件是用来画流程图的,告诉框架我要的流程是怎么个走法,也可以不用插件自己手写,但是会累死↖(▔^▔)↗(就像hibernate实体类映射一样,都是用插件生成的),生成的文件名后缀是bpmn

  这个流程配置文件就是用来展示流程是什么样的,可以用这个插件打开显示为图片,也可以以xml的方式打开,它本质上就是xml,不过为了方便插件帮你展示为图片

  用插件打开一个流程图文件是这样的:

        

  用xml方式打开是这样的:

  当然还有最后一步别忘了!

  

  因为假如要定义一个流程的话就需要bpmn和jpg两个文件,至于为什么。。。那就是框架就这么定义的

  4、建表

  还记得之前说的吗,activiti它也是用数据库记录我们的流程数据,所以,我们得为它建表。这个框架还是很方便的,可以自动帮我们建表

  

  备注:这个activiti框架既可以用于普通java项目,也可以用于web项目,建项目一定要记得导jar包,加jdbc驱动,加配置文件,配置文件里面的数据库配置也要改成你自己的    切记切记~

  执行一下这个test2方法就建好表了:

    

  备注:我们调用test2方法的时候,activiti就会执行自己jar包里面的珍藏的sql文件乀(ˉεˉ乀),有兴趣可以打开看看

  解释一下这些表:

  

  

  

  

  

  5、画流程

  

  这个插件用起来还是蛮简单的,一看就会,不过有点bug

    三、开始入(biao)门(che)

   

  经过准备工作之后就开始入门啦

  1、准备工作里面最后一步画了一个流程图,保存之后会有两个文件,一个是原本自己建的bpmn后缀的文件,还有一个是自动帮你生成的jpg。

      

  

   这个流程我们用插件定义好了,接下来我们要干的事就是把它假如到数据库里面(部署流程定义):

   activiti里面的操作都用到一个叫工作流引擎(ProcessEngine)的东西,它就是工作流的核心,可以把它理解为电脑的cpu,干什么事情都要它来执行

  

  

  

   然后每次执行一个方法都要创建它不方便,下面的栗子里就把它当作成员变量

   

    这样我们就创建了一个请假流程,然后打印这个流程的id,

    接下来就是一些api的使用了,用起来不难,但不知道是怎么实现的,感觉我现在的工作都是在用别人写好的轮子,虽然方便,但是一报错就懵了

  2、查询流程定义

      

  3、根据流程定义启动流程实例

    流程实例:根据某个流程定义一次具体的执行过程就是一个流程实例。流程定义和流程实例一对多。这个就有点像类和对象,流程定义是一个模板,然后批量生产流程实例

    举个栗子:你定义一套请假流程(流程定义),然候别人要请假都是要走这个流程,而且会有很多次(流程实例)

    

    备注:这个id就是之前查到的

  4、查询个人任务

    假如流程走到这个人这里,就可以查到他名下有一个任务等着他处理,就像你申请请假,然后你的部门经理就需要处理这个请求

    

  5、办理个人任务

    

  6、API总结

    

  到此为此,我们就走完了一个完整的流程

    四、进击

  

  1、设置流程变量                                                                                                                           

  

  这个就相当于这个流程实例的一些属性,是以键值对的方式存储于数据库,如上图:qjyy是键,不想上班 是值。因为每个人的请假原因都不相同,所以我们需要定义一些属性来存储一些个性化的东西。

  总共有四种方式设置流程变量

    1.1 启动流程实例时设置

    

    备注:这个processDefinitionKey就是流程定义的key,这个key是我们当初画图时候定义的,假如没有定义默认是myProcess;variables就是一个map用来存储我们需要加入的流程变量

    1.2 办理任务时设置

    

  

    1.3 使用RuntimeService的set方法设置

    

    1.4 使用 TaskService 的set方法设置

    

    注意:如果设置的是自定义的类型,需要实现序列号接口

  2、获取流程变量                                                                                                                           

  总共有三种方式获取流程变量

    2.1 使用RuntimeService的get方法获取

    

    2.2 使用TaskService的get方法获取

    

     2.3 使用框架提供的表单式获取 (重要)

    

    之前这个都是写死了的,比如第一个流程我写的是王五,然后这个流程就只能是王五操作,但实际情况是谁都可以申请,所以我们要把这个改成活的,activity提供了类似el表达式的操作

    如上图我写的是 ${loginUser} 然后启动流程实例的时候就会去找键为loginUser的流程变量,所以我们要在启动流程实例前确保有loginUser的流程变量,否则会抛异常,然后实际项目中就是从session中取出当前用户的名字,然后设置loginUser的流程变量,再然后activiti框架就会自动帮你取出来,流程实例的申请人就是当前用户。

  3、组任务                                                                                                                          

  有时候流程不止会有一个执行人,比如你的财务申请,整个财务部都可以审批。所以我们需要把原本的一个人改成一个组,如下图

  

  创建组:

  

  创建用户:

  

  建立用户和组的关系:

  

  查询组任务:

  

  拾取组任务:

  

  4、排他网关                                                                                                                           

  大部分时候流程不会是一条直线,分支是很常见的情况,然后需要一个东西决定流程实例往哪条分支走,这个东西就是排他网关

  

  图中的condition就是这个网关的调教,假如请假天数小于3,就往上走,假如小于3,就往下走。可以看到这个用了activiti提供的el表达式,然后这个 qjts 很明显就是从流程实例变量里面取出来的。

  至于什么为上,什么为下,这个由这条分支的id大小决定的。

  下面是温习一下两种方式设置流程变量

  

  

  

  5、与spring整合                                                                                                                           

  和spring整合非常简单,就是改下配置文件

    

    5.1使用spring提供的流程引擎配置对象

    

    5.2 提供数据源和事务管理器

    

    5.3 使用 spring 提供的流程引擎工厂 bean创建流程引擎对象

    

    然后就完成整合了

    六、总结

    总的来说,activiti提供了友好的接口,屏蔽了很多细节,使用起来不是很难。

    这篇博客从上午写到下午,脖子反抗了多次╮(╯▽╰)╭。假如对你有帮助的话,点个赞吧

    本文禁止一切形式转载!

Activiti工作流框架——快速上手的更多相关文章

  1. 项目结合activiti工作流框架使用

    项目结合activiti工作流框架使用: 1.项目与工作流框架的结合. 2.状态:草稿(待审批).审批中.审批通过.审批失败 3. 提交审批: 0 草稿(待审批),记录绑定工作流执行id,审批状态设置 ...

  2. activiti工作流框架简介

    常见的工作流框架:activiti, JBPM, OSWorkflow activiti框架基于23张基础的表数据, 基于Mybatis操作数据库. JBPM框架基于18张基础的表数据, 基于hibe ...

  3. Activiti工作流框架学习(一)——环境的搭建和数据表的了解

    一.什么是工作流 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现 ...

  4. Activiti工作流框架学习(一)之通用数据表详细介绍

    文/朱季谦 Activiti工作流引擎自带了一套数据库表,这里面有一个需要注意的地方: 低于5.6.4的MySQL版本不支持时间戳或毫秒级的日期.更糟糕的是,某些版本在尝试创建此类列时将引发异常,而其 ...

  5. Activiti工作流框架学习笔记(二)之springboot2.0整合工作流Activiti6.0

    以前在工作当中做过不少与工作流Activiti有关的工作,当时都是spring集成activiti5.22的项目,现在回过头去看,其实版本已经稍微老了,因此,基于先前的工作经验,决定用较新版本的技术来 ...

  6. Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作

    可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal  error  war ...

  7. 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解

    流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...

  8. Caliburn Micro框架快速上手(WP)

    一.使用nuget添加起始工程         二.修改App.xaml文件和App.xaml.cs文件     AppBootstrapper介绍: AppBootstrapper根据中文的直译可以 ...

  9. Activiti工作流小序曲

    一般涉及到OA.ERP等公司办公系统都必须有一套办公流程,这时候使用activiti工作流框架会大大减轻我们的工作量,提高我们的开发效率. Activiti工作流简单介绍: 工作流(workflow) ...

随机推荐

  1. 01-css的引入方式

    [转]01-css的引入方式 引入css方式(重点掌握) 行内样式 内接样式 外接样式 3.1 链接式 3.1 导入式 css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述 ...

  2. ios手机录屏软件哪个好

    苹果手机中的airplay镜像,是苹果手机系统的一大特色,可以轻松把手机屏幕投射电脑,这个功能使苹果手机相较安卓手机投屏会更加轻松,那么如何实现苹果手机投射电脑屏幕?下面小编便来分享ios手机录屏软件 ...

  3. openlayers3 实现点选的几种方式

    WebGIS开发中,点击查询是最常用的一种查询方式,在ArcGIS api 中,这种查询叫IdentifyTask,主要作用是前台提交参数,交ArcServer查询分析返回.本文从开源框架的角度,从前 ...

  4. Json对象遍历

    var json = {"id":"123","name":"tom","sex":"ma ...

  5. 使用Java反射优化多个方法调用

    有段时间没来写博客了,心里一直念叨空了来,今天有时间来记录一篇.前段时间领导提出优化部分系统模块,根据业务要求系统中有很多产品,产品下面有N个指标,一个指标就对应一个方法,所以系统代码中就是这样一个情 ...

  6. 我的第一个python web开发框架(28)——定制ORM(四)

    在数据库操作时,新增记录也是必不可少的,接下来我们应用字典的特性来组合sql语句 先上产品新增接口代码 @post('/api/product/') def callback(): "&qu ...

  7. c# 正则验证

    1.验证百分数 bool tempBool = Regex.IsMatch(str, @"[1-9]{0,1}[0-9](\\.[0-9])?%");

  8. Vue 自定义一个插件的用法、小案例及在项目中的应用

    1.开发插件 install有两个参数,第一个是Vue构造器,第二个参数是一个可选的选项对象   MyPlugin.install = function (Vue, options) {   // 1 ...

  9. opn要求

    1.在公司 ♦可以通过阿里云的公网ip访问pg 2.不在公司 ♦需要连接VPN才可访问阿里云的公网ip的应用(假定pg),但是特别的应用不在公司也可直接访问(假定gitlab) 思路提示:vpn黑白名 ...

  10. 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值

    package com.Summer_0426.cn; /** * @author Summer * 通过supper()有参构造器,完成子类对象调用父类属性的方法,并完成赋值 * */ public ...