Activiti初学者教程.docx

上传人:b****1 文档编号:2027441 上传时间:2023-05-02 格式:DOCX 页数:17 大小:457.88KB
下载 相关 举报
Activiti初学者教程.docx_第1页
第1页 / 共17页
Activiti初学者教程.docx_第2页
第2页 / 共17页
Activiti初学者教程.docx_第3页
第3页 / 共17页
Activiti初学者教程.docx_第4页
第4页 / 共17页
Activiti初学者教程.docx_第5页
第5页 / 共17页
Activiti初学者教程.docx_第6页
第6页 / 共17页
Activiti初学者教程.docx_第7页
第7页 / 共17页
Activiti初学者教程.docx_第8页
第8页 / 共17页
Activiti初学者教程.docx_第9页
第9页 / 共17页
Activiti初学者教程.docx_第10页
第10页 / 共17页
Activiti初学者教程.docx_第11页
第11页 / 共17页
Activiti初学者教程.docx_第12页
第12页 / 共17页
Activiti初学者教程.docx_第13页
第13页 / 共17页
Activiti初学者教程.docx_第14页
第14页 / 共17页
Activiti初学者教程.docx_第15页
第15页 / 共17页
Activiti初学者教程.docx_第16页
第16页 / 共17页
Activiti初学者教程.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Activiti初学者教程.docx

《Activiti初学者教程.docx》由会员分享,可在线阅读,更多相关《Activiti初学者教程.docx(17页珍藏版)》请在冰点文库上搜索。

Activiti初学者教程.docx

Activiti初学者教程

Activiti初学者教程

1.初识Activiti

工作流与工作流引擎

工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。

它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

(我的理解就是:

将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化)

所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。

例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性和弹性。

比如你的系统中有一个任务流程,一般情况下这个任务的代码逻辑、流程你都要自己来编写。

实现它是没有问题的。

但是谁能保证逻辑编写的毫无纰漏?

经过无数次的测试与改进,这个流程没有任何漏洞也是可以实现的,但是明显就会拖慢整个项目的进度。

 工作流引擎解决的就是这个问题:

如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。

BPMN2.0规范

BPMN(BusinessProcessModelandNotation)--业务流程模型与符号。

BPMN是一套流程建模的标准,主要目标是被所有业务用户容易理解的符号,支持从创建流程轮廓的业务分析到这些流程的最终实现,知道最终用户的管理监控。

通俗一点其实就是一套规范,画流程模型的规范。

流程模型包括:

流程图、协作图、编排图、会话图。

详细信息请google。

Activiti概述

Activiti由来

学习过Activiti的朋友都知道,Activiti的创始人也就是JBPM(也是一个优秀的BPM引擎)的创始人,从Jboss离职后开发了一个新的BPM引擎:

Activiti。

所以,Activiti有很多地方都有JBPM的影子。

所以,据说学习过JBPM的朋友学起Activiti来非常顺手。

由于本人之前没有工作流及JBPM的相关基础,刚开始学习Activiti的时候可以说是无比痛苦的,根本不知道从何下手,这里也建议大家先进行工作流及BPMN2.0规范的学习,有了一定的基础后,再着手学习Activiti。

Activiti简介

Activiti是一个开源的工作流引擎,它实现了BPMN2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。

Activiti作为一个遵从Apache许可的工作流和业务流程管理开源平台,其核心是基于Java的超快速、超稳定的BPMN2.0流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。

Activiti流程引擎重点关注在系统开发的易用性和轻量性上。

每一项BPM业务功能Activiti流程引擎都以服务的形式提供给开发人员。

通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的BPM应用程序。

文档说明

以上部分对工作流、BPMN、Activiti的概念做了一个简单的介绍,目的是了解Activiti究竟是什么,能做些什么…及在学习Activiti之前需要了解的知识与技术。

其中大部分文字来自Copy网上的各种资料与文档,通过总结而来的。

具体的更详细的内容需自己google,参考一些官方的文档与手册。

本文档之后内容如下:

1)下载与使用

2)核心组件与说明

3)入门示例

4)Eclipse中的Activiti插件的使用

本文档旨在为初学Activiti的朋友提供入门级别的参考,不会对其原理及其结构进行深层次的探究(更多是因为目前自身理解还不是很透彻),只是为大家理清思路,方便以后更深层次的学习。

本文档还有一个重要的特点,那就是根据自己看官方手册的经验,教大家如何看手册从而更有效率!

由于是初学,很多术语或解释难免理解有偏差,所以一定要看官方提供的文档与手册,那才是学习的最佳途径!

2.开始学习

必要的准备

下载与了解目录

下载Activiti:

下载路径,也就是官方网站的地址:

http:

//activiti.org/download.html。

下载后解压(我所使用的是5.12版本的,Activiti更新速度飞快,几乎每两个月就会有一个更新的小版本),看到如下目录:

1)database:

里面存放的是Activiti使用到的数据库信息的sql文件,它支持的数据库类型如下图,使用时只需执行你自己的数据库类型的文件即可。

如:

你的数据库是mysql,那么就执行activiti.mysql.create.*.sql即可。

2)docs:

毫无疑问,api文档是也。

3)libs:

使用Activiti所需要的所有的jar包和源文件。

4)wars:

官方给我们提供的示例Demo,通过使用Demo可以更加快速的了解Activiti。

其他准备

使用Activiti,首先当然要有jdk了!

6+版本就可以了。

其次,要有一款IDE,我们当然会使用Eclipse,这里使用Juno版本。

然后,web容器当然也要有,这里使用Tomcat6.0版本。

然后就是Activiti的Eclipse插件了,这个后面再介绍。

一分钟入门(见用户手册)

所谓的一分钟入门就是通过运行你下载的包里的wars文件夹里的activiti-explorer.war文件,以便更快的了解Activiti。

将文件拷贝至Tomcat的webapps目录,启动tomcat,输入http:

//localhost:

8080/activiti-explorer。

然后你就可以开整了!

总算是有一点微小的进展了。

这里需要说明的就是,这个Demo默认采用的是h2内存数据库,如果想用你自己的数据库,就需要修改web应用WEB-INF/classes目录下的db.properties。

然后,按上面说的,把database里的create文件夹里的数据库文件导入你自己的数据库(如果没有修改db.properties,就不用导入了)。

Demo的具体解释与数据库配置的具体信息详见官方手册,手册已经说的很清楚了。

这里需要重点了解activiti.cfg.xml的配置以及如何构建ProcessEngine(配置文件构建方式、代码构建方式)。

对Demo的使用介绍在官方文档的后面才开始介绍,这里建议应用跑起来之后,先自己试试手(可看后面介绍Demo如何使用的章节),看看如何跑一个流程、整个流程是怎么流的、并随时关注数据库表里的数据的变化等,对以后的学习很有帮助!

核心组件介绍

关键对象

1.Deployment:

流程部署对象,部署一个流程时创建。

2.ProcessDefinitions:

流程定义,部署成功后自动创建。

3.ProcessInstances:

流程实例,启动流程时创建。

4.Task:

任务,在Activiti中的Task仅指有角色参与的任务,即定义中的UserTask。

5.Execution:

执行计划,流程实例和流程执行中的所有节点都是Execution,如UserTask、ServiceTask等。

服务接口

1.ProcessEngine:

流程引擎的抽象,通过它我们可以获得我们需要的一切服务。

2.RepositoryService:

Activiti中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据(例如BPMN2.0XML文件,表单定义文件,流程定义图像文件等),这些文件都存储在Activiti内建的Repository中。

RepositoryService提供了对repository的存取服务。

3.RuntimeService:

在Activiti中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。

RuntimeService提供了启动流程、查询流程实例、设置获取流程实例变量等功能。

此外它还提供了对流程部署,流程定义和流程实例的存取服务。

4.TaskService:

在Activiti中业务流程定义中的每一个执行节点被称为一个Task,对流程中的数据存取,状态变更等操作均需要在Task中完成。

TaskService提供了对用户Task和Form相关的操作。

它提供了运行时任务查询、领取、完成、删除以及变量设置等功能。

5.IdentityService:

Activiti中内置了用户以及组管理的功能,必须使用这些用户和组的信息才能获取到相应的Task。

IdentityService提供了对Activiti系统中的用户和组的管理功能。

6.ManagementService:

ManagementService提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。

7.HistoryService:

HistoryService用于获取正在运行或已经完成的流程实例的信息,与RuntimeService中获取的流程信息不同,历史信息包含已经持久化存储的永久信息,并已经被针对查询优化。

现在至少要知道有这些对象和接口。

并结合ActivitiApi这一章节来看,你就会对部署流程、启动流程、执行任务等操作有一个基本的概念。

之后编写一个简单的单元测试,主要为了测试activiti.cfg.xml配置的是否正确,流程是否可以被部署即可。

至于与Spring的集成,一定要熟悉基于Spring配置Activiti,以及事务的处理。

3.入门示例(参考手册中10分钟教程)

概述

下面开始编写一个示例。

这个Demo为一个“月度报表申请”流程。

由“sales(销售)”组的用户制作月度报表,提交给“management(经理)”组的用户,经理审批该报表,最后结束。

流程图如下:

这个Demo完成之后,我们会进行两个测试。

一个是代码中的单元测试,就是跑一遍流程,看一下流程在跑的过程中输出的信息;一个是我们将编辑好的bpmn20.xml文件通过我们之前一分钟入门的示例activiti-explorer应用导入进去,查看它的流程图,并完整执行一遍流程。

在编写这个Demo之前,至少要了解Activiti与Spring如何集成、XxxService各自的任务与作用,并完成上一章的Demo。

流程文件xxx.bpmn20.xml

首先,我们就来编写这个流程的bpmn20.xml文件。

 targetNamespace="http:

//activiti.org/bpmn20"

 xmlns:

activiti="http:

//activiti.org/bpmn"

 xmlns="http:

//www.omg.org/spec/BPMN/20100524/MODEL">

    

     

     

     

      

       Writemonthlyfinancialreportforpublicationtoshareholders.

      

      

       

        sales

       

      

     

     

     

      

       Verifymonthlyfinancialreportcomposedbytheaccountancydepartment.

       Thisfinancialreportisgoingtobesenttoallthecompanyshareholders.

      

      

       

        management

       

      

     

     

     

    

这里对部分代码进行解释。

1)文件的开头部分,这里的id对于Activiti来说,应该叫做key。

创建流程实例时,会根据此id来得到这个流程。

2)开始流程。

3)顺序流(就是连接各个节点的指向线)

sourceRef和targetRef分别为起始节点和目标节点。

4)描述用户任务

id为该用户任务的标识。

documentation为该用户任务的描述。

5)分配用户

可以把任务分配给指定的用户,也可以分配给指定的组,并且可以有多个,详见用户手册。

Spring配置文件

这里配置了数据源、事务管理、流程引擎及几个必要的xxxService。

这里数据源使用的是dbcp。

数据库信息就配置成你自己本地数据库的信息,如果不会配置。

destroy-method="close">

mysql:

//localhost:

3306/activiti"/>

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

factory-method="getRepositoryService"/>

factory-method="getRuntimeService"/>

factory-method="getTaskService"/>

factory-method="getHistoryService"/>

factory-method="getManagementService"/>

annotation-driventransaction-manager="transactionManager"/>

注:

bpmn20.xml文件中用到了两个用户组(sales、management),是因为我们启动Tomcat运行activiti-explorer应用初始化时自动就会往数据库里添加一些数据,其中用户组的表中就会添加几条记录,其中就包括这两个组,所以不用管它怎么来的,总之数据库里有这两个组就对了。

而应用默认使用的是内存数据库,服务一停止数据也就没有了。

所以为了进行单元测试,需要按前面讲的修改数据库配置的方法:

把activiti-explorer应用的数据库配置改成你自己的本地数据库的信息,我使用的是Mysql数据库。

再启动tomcat运行应用(目的就是为了让数据库有数据),这时你的本地数据库就有数据了,可以编写测试用例进行单元测试了。

编写测试用例

1)读取Spring配置文件,注入流程所需的Service

2)编写测试方法

@Test

publicvoidmonthtest(){

//部署流程定义

repositoryService.createDeployment().addClasspathResource("myProcess.bpmn20.xml").deploy();

//启动流程实例

StringprocId=runtimeService.startProcessInstanceByKey("financialReport").getId();

//获得第一个任务

Listtasks=taskService.createTaskQuery().taskCandidateGroup("sales").list();

for(Tasktask:

tasks){

System.out.println("Followingtaskisavailableforsalesgroup:

"+task.getName());

//认领任务这里由foozie认领,因为fozzie是sales组的成员

taskService.claim(task.getId(),"fozzie");

}

//查看fozzie现在是否能够获取到该任务

tasks=taskService.createTaskQuery().taskAssignee("fozzie").list();

for(Tasktask:

tasks){

System.out.println("Taskforfozzie:

"+task.getName());

//执行(完成)任务

taskSplete(task.getId());

}

//现在fozzie的可执行任务数就为0了

System.out.println("Numberoftasksforfozzie:

"

+taskService.createTaskQuery().taskAssignee("fozzie").count());

//获得第二个任务

tasks=taskService.createTaskQuery().taskCandidateGroup("management").list();

for(Tasktask:

tasks){

System.out.println("Followingtaskisavailableforaccountancygroup:

"+task.getName());

//认领任务这里由kermit认领,因为kermit是management组的成员

taskService.claim(task.getId(),"kermit");

}

//完成第二个任务结束流程

for(Tasktask:

tasks){

taskSplete(task

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2