1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 工作流引擎 Activiti 入门详解

工作流引擎 Activiti 入门详解

时间:2022-09-08 22:14:47

相关推荐

工作流引擎 Activiti 入门详解

点击关注公众号,利用碎片时间学习

1. 什么是工作流

1.1 工作流介绍

工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。

1.2 工作流系统

什么是工作流系统

具有工作流程功能的软件系统。用于更好的管理业务流程。

适用行业,各行各业

比如,消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。

具体场景,凡是涉及到业务流程的所有场景

关键业务流程:订单、报价处理、合同审核、客户电话处理、供应链管理等

行政管理类:出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。

人事管理类:员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。

财务相关类:付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。

客户服务类:客户信息管理、客户投诉、请求处理、售后服务管理等。

1.3 工作流实现方式

目前常见的工作流程有两种方式:

通过状态字段实现流程控制。原始,适合简单流程控制。

工作流引擎实现流程控制。适用场景更广泛,扩展性更好。

1.4 工作流实现原理

Activiti牛批之处在于,它在不改变代码的前提下实现各种业务流程的管理,适用性,扩展性很优秀。

activiti通过创建流程实例引擎,可以实现不同流程的流转,通过不断读取创建的流程节点实现流程流转。

2. Activiti7概述

2.1 Activiti介绍

Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。

当然这里还有一些小故事,Alfresco 软件在 年 5 月 17 日宣布 Activiti 业务流程管理(BPM)开源项目的正式启动, 其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任, Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 activiti 也是一个工作流引擎。

官方网站:/

下边介绍三个名词概念,就不长篇大论了,简单总结下。

BPM:BPM(Business Process Management),即业务流程管理。

BPM系统:那就是业务流程管理的系统。

BPMN,这个比较噢重要,多说两句,具体往下看。

BPMN(Business Process Model And Notation) - 业务流程模型和符号 是由 BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。

总结来说就是用来建模业务流程的标准规则,一个个符号!

2.2 Activiti使用

一般情况下都是通过创建BPMN进行业务流程建模,两种方式,idea插件或者eclipse插件,通过符号创建流程。

idea安装bpmn插件

在 IDEA 的 File 菜单中找到子菜单”Settings”,后面我们再选择左侧的“plugins”菜单,如下图所示

3. Activiti环境配置

3.1 创建数据库

CREATEDATABASEactivitiDEFAULTCHARACTERSETutf8;

3.2 初始化数据库表:

创建Maven工程

加入依赖

<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="/POM/4.0.0"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.activiti.demo</groupId><artifactId>activiti_demo</artifactId><version>1.0-SNAPSHOT</version><!--定义统一版本--><properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version></properties><dependencies><!--引入依赖activiti--><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-layout</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>org.activiti.cloud</groupId><artifactId>activiti-cloud-services-api</artifactId><version>7.0.0.Beta1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--logstart--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!--logend--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency></dependencies><repositories><repository><id>alfresco</id><name>ActivitiReleases</name><url>/nexus/content/repositories/activiti-releases/</url><releases><enabled>true</enabled></releases></repository></repositories></project>

配置日志

#SetrootcategoryprioritytoINFOanditsonlyappendertoCONSOLE.#log4j.rootCategory=INFO,CONSOLEdebuginfowarnerrorfatallog4j.rootCategory=debug,CONSOLE,LOGFILE#SettheenterpriseloggercategorytoFATALanditsonlyappendertoCONSOLE..apache.axis.enterprise=FATAL,CONSOLE#CONSOLEissettobeaConsoleAppenderusingaPatternLayout.log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m\n#LOGFILEissettobeaFileappenderusingaPatternLayout.log4j.appender.LOGFILE=org.apache.log4j.FileAppenderlog4j.appender.LOGFILE.File=d:/axis.loglog4j.appender.LOGFILE.Append=truelog4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayoutlog4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601}%-6r[%15.15t]%-5p%30.30c%x-%m\n

配置activity.cfg.xml

<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/contex/schema/context/spring-context.xsd/schema/tx/schema/tx/spring-tx.xsd"><!--数据源配置dbcp--><beanid="dataSource"class="mons.dbcp.BasicDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/activiti"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></bean><!--activiti单独运行的ProcessEngine配置对象(processEngineConfiguration),使用单独启动方式默认情况下:bean的id=processEngineConfiguration--><beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--代表数据源--><propertyname="dataSource"ref="dataSource"></property><!--关于processEngineConfiguration中的databaseSchemaUpdate参数,通过此参数设计activiti数据表的处理策略,参数如下:false(默认):检查数据库表的版本和依赖库的版本,如果版本不匹配就抛出异常。true:构建流程引擎时,执行检查,如果需要就执行更新。如果表不存在,就创建。create-drop:构建流程引擎时创建数据库表,关闭流程引擎时删除这些表。drop-create:先删除表再创建表。create:构建流程引擎时创建数据库表,关闭流程引擎时不删除这些表。--><!--代表是否生成表结构--><propertyname="databaseSchemaUpdate"value="true"/></bean></beans>

编写代码

/***Activiti初始化25张表*执行的是activiti-engine-7.0.0.Beta1.jar包下对应不同内置好的sql语句*org\activiti\db\drop\activiti.db2.drop.engine.sql**@authorzrj*@date/12/29*@sinceV1.0**/publicclassActivitiInit{/***方式一*/@TestpublicvoidGenActivitiTables(){// 1.创建ProcessEngineConfiguration对象。第一个参数:配置文件名称;第二个参数:processEngineConfiguration的bean的idProcessEngineConfigurationprocessEngineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration");//2.创建ProcessEngine对象ProcessEngineprocessEngine=processEngineConfiguration.buildProcessEngine();//3.输出processEngine对象System.out.println(processEngine);}/***方式二*/@TestpublicvoidGenActivitiTables2(){//条件:1.activiti配置文件名称:activiti.cfg.xml 2.bean的id="processEngineConfiguration"ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();System.out.println(processEngine);}}

3.3 创建数据库表

执行上边的代码。

3.4 数据库表命名规则

Activiti 的表都以 ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的 API 对应。

ACT_RE_*: 'RE'表示repository。这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU_*: 'RU'表示runtime。这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。

ACT_HI_*: 'HI'表示history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 'GE'表示general。通用数据, 用于不同场景下

4. Activiti架构简介

activiti.cfg.xml

activiti 的引擎配置文件,包括:ProcessEngineConfiguration的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了ProcessEngineConfiguration和数据源。

ProcessEngineConfiguration

流程引擎的配置类,通过ProcessEngineConfiguration可以创建工作流引擎ProceccEngine,常用的两种方法。

ProcessEngine

工作流引擎,相当于一个门面接口,通过ProcessEngineConfiguration创建processEngine,通过ProcessEngine创建各个 service 接口。

Service

通过ProcessEngine创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。

5. Activiti入门案例

5.1 流程定义

什么是流程定义

流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用activiti-explorer(web 控制台)或activiti-eclipse-designer插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn.png

创建bpmn文件

Palette(画板)

在 eclipse 或 idea 中安装activiti-designer插件即可使用,画板中包括以下结点:

Connection—连接

Event---事件

Task---任务

Gateway---网关

Container—容器

Boundary event—边界事件

Intermediate event- -中间事件

流程图设计完毕保存生成.bpmn 文件

idea创建bpmn

生成png图片

第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml

第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe

第三步:打开后的效果图如下:

打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:

第五步:中文乱码的解决

打开 IDEA 安装路径,找到如下的安装目录

根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在idea64.exe.vmoptions文件的最后一行追加一条命令:-Dfile.encoding=UTF-8

如下所示

一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题

5.2 部署流程

什么是流程部署

将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。

单个文件部署方式

分别将 bpmn 文件和 png 图片文件部署

压缩包部署方式

/***流程定义的部署* activiti表有哪些?*act_re_deployment部署信息*act_re_procdef流程定义的一些信息*act_ge_bytearray流程定义的bpmn文件及png文件**@authorzrj*@date/12/29*@sinceV1.0**/publicclassActivitiDeployment{/***方式一*分别将bpmn文件和png图片文件部署*/@TestpublicvoidactivitiDeploymentTest(){//1.创建ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//2.得到RepositoryService实例RepositoryServicerepositoryService=processEngine.getRepositoryService();//3.进行部署Deploymentdeployment=repositoryService.createDeployment().addClasspathResource("diagram/holiday.bpmn").addClasspathResource("diagram/holiday.png").name("请假申请单流程").deploy();//4.输出部署的一些信息System.out.println(deployment.getName());System.out.println(deployment.getId());}/***方式二*将holiday.bpmn和holiday.png压缩成zip包*/@TestpublicvoidactivitiDeploymentTest2(){//1.创建ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//2.得到RepositoryService实例RepositoryServicerepositoryService=processEngine.getRepositoryService();//3.转化出ZipInputStream流对象InputStreamis=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holidayBPMN.zip");//将inputstream流转化为ZipInputStream流ZipInputStreamzipInputStream=newZipInputStream(is);//3.进行部署Deploymentdeployment=repositoryService.createDeployment().addZipInputStream(zipInputStream).name("请假申请单流程").deploy();//4.输出部署的一些信息System.out.println(deployment.getName());System.out.println(deployment.getId());}}

操作数据表

-- activiti表有哪些?--部署信息select*fromact_re_deployment;--流程定义的一些信息select*fromact_re_procdef;--流程定义的bpmn文件及png文件select*fromact_ge_bytearray;

5.3 启动流程

/***启动流程实例:*前提是先已经完成流程定义的部署工作*背后影响的表:*act_hi_actinst已完成的活动信息*act_hi_identitylink参与者信息*act_hi_procinst流程实例*act_hi_taskinst任务实例*act_ru_execution执行表*act_ru_identitylink参与者信息*act_ru_task任务**@authorzrj*@date/12/29*@sinceV1.0**/publicclassActivitiStartInstance{publicstaticvoidmain(String[]args){//1.得到ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//2.得到RunService对象RuntimeServiceruntimeService=processEngine.getRuntimeService();//3.创建流程实例流程定义的key需要知道holidayProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("holiday");//4.输出实例的相关信息System.out.println("流程部署ID"+processInstance.getDeploymentId());System.out.println("流程定义ID"+processInstance.getProcessDefinitionId());System.out.println("流程实例ID"+processInstance.getId());System.out.println("活动ID"+processInstance.getActivityId());}}

5.4 流程定义查询

/***流程定义查询**@authorzrj*@date/12/29*@sinceV1.0**/publicclassQueryProceccDefinition{@TestpublicvoidqueryProceccDefinition(){//流程定义keyStringprocessDefinitionKey="holiday";//1.得到ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//获取repositoryServiceRepositoryServicerepositoryService=processEngine.getRepositoryService();//查询流程定义ProcessDefinitionQueryprocessDefinitionQuery=repositoryService.createProcessDefinitionQuery();//遍历查询结果List<ProcessDefinition>list=processDefinitionQuery.processDefinitionKey(processDefinitionKey).orderByProcessDefinitionVersion().desc().list();for(ProcessDefinitionprocessDefinition:list){System.out.println("------------------------");System.out.println("流程部署 id :"+processDefinition.getDeploymentId());System.out.println("流程定义id:"+processDefinition.getId());System.out.println("流程定义名称:"+processDefinition.getName());System.out.println("流程定义key:"+processDefinition.getKey());System.out.println("流程定义版本:"+processDefinition.getVersion());}}}

5.5 流程定义删除

/***删除指定流程id的流程*/publicvoiddeleteDeployment(){//流程部署idStringdeploymentId="8801";//1.得到ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//通过流程引擎获取repositoryServiceRepositoryServicerepositoryService=processEngine.getRepositoryService();//删除流程定义,如果该流程定义已有流程实例启动则删除时出错repositoryService.deleteDeployment(deploymentId);//设置true级联删除流程定义,即使该流程有流程实例启动也可以删除,设//置为false非级别删除方式,如果流程repositoryService.deleteDeployment(deploymentId,true);}

5.6 流程定义资源查询

/***获取资源*/@TestpublicvoidgetProcessResources()throwsIOException{//流程定义idStringprocessDefinitionId="";//1.得到ProcessEngine对象ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();//获取repositoryServiceRepositoryServicerepositoryService=processEngine.getRepositoryService();//流程定义对象ProcessDefinitionprocessDefinition=repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();//获取bpmnStringresource_bpmn=processDefinition.getResourceName();//获取pngStringresource_png=processDefinition.getDiagramResourceName();//资源信息System.out.println("bpmn:"+resource_bpmn);System.out.println("png:"+resource_png);Filefile_png=newFile("d:/purchasingflow01.png");Filefile_bpmn=newFile("d:/purchasingflow01.bpmn");//输出bpmnInputStreamresourceAsStream=null;resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_bpmn);FileOutputStreamfileOutputStream=newFileOutputStream(file_bpmn);byte[]b=newbyte[1024];intlen=-1;while((len=resourceAsStream.read(b,0,1024))!=-1){fileOutputStream.write(b,0,len);}//输出图片resourceAsStream=repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),resource_png);fileOutputStream=newFileOutputStream(file_png);//byte[]b=newbyte[1024];//intlen=-1;while((len=resourceAsStream.read(b,0,1024))!=-1){fileOutputStream.write(b,0,len);}}

来源:/m0_37583655/article/

details/121335771

推荐:最全的java面试题库PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。