ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

activiti入门

2021-12-13 14:00:51  阅读:218  来源: 互联网

标签:定义 bpmn -- 流程 activiti 实例 入门


最近项目有个工作流的需求,从头开始学一下activiti,记录一些问题。

1.去官网下载activiti7.0或者使用maven下载,并在idea中下载activiBPM流程插件

2.创建一个普通的maven依赖,添加activiti、mysql、mybatis、连接池、junit等jar包。推荐使用

相关配置如下:

<properties>
<activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.activiti</groupId>-->
<!--<artifactId>activiti-json-converte</artifactId>-->
<!--<version>${activiti.version}</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.activiti</groupId>-->
<!--<artifactId>activiti-cloud-services</artifactId>-->
<!--<version>${activiti.version}</version>-->
<!--</dependency>-->

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.28</version>
</dependency>
</dependencies>
有两个依赖下不下来,先不管它,后面再填坑

3.在resource下配置log4j,activiti.cfg.xml配置文件(

<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"/>
<!--数据库用户名和密码-->
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<!--activiti数据库表在生成时的策略-->
<!--true表示数据库中存在相应的表就直接使用,不存在则创建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>

),注意bean的id和配置文件的名称都不能修改。

4.创建一个单元测试类:

使用activiti提供的默认方式来创建mysql表需要使用activiti提供的工具类,
读取配置文件生成,processEngine生成时会自动创建mysql的表。
public void testCreateDbTable(){

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
运行,这个时候会自动帮我们生成25张数据库表,前提是要去手动创建好数据库activiti,字符集为utf-8.

5.生成的数据库表详细说明:
act开头,代表是activiti的表,在流程和业务的表存在同一个数据库中的时候,这个时候我们可以很容易区分开,
ge:一般数据,hi:历史数据,流程定义:re,运行实例:ru,每个表的详细内容就不介绍了,可以自行百度一首。

6.准备创建activiti工作流:
  1.定义流程:按照BPMN的规范,使用流程定义工具,用流程符号把整个流程描述出来
  2.流程部署,把画好的流程定义文件,加载到数据库表中,生成表的数据
  3.启动流程:使用java代码来操作数据库表中的内容
7.使用idea流程设计器设计流程(就是我们一开始装的activiti插件,将xml用图形化展示编辑),在resources下创建bpmn目录,创建一个实例evction.bpmn
开始编辑图形流程,画出节点的流向和指定节点的负责人,编辑结束后,将bpmn文件复制一份到桌面以防万一,然后将bpmn文件的格式修改为xml,再右键点击

 

 ,然后再到导出文件

 

 保存到桌面就可以了,然后将这个png文件复制到刚才的bpmn文件夹中,再将刚才的xml格式改为bpmn。

 

 过程中如果出现乱码:
1.打开settings,找到file encodings配置选项,将项目编码修改为UTF-8,应用即可

 

 

2.修改idea安装路径,配置文件,在以下2个配置文件末尾追加一行,-Dfile.encoding=UTF-8,注意不要有空格。修改之后,重启idea.

 8.接着用java代码部署,就是将流程写入数据库中。

 

使用repositoryService 
public class ActivitiDemo {
@Test
public void testDeployment(){
// 1.创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.使用service进行流程部署,定义一个流程的名字并把bmpn文件和png文件部署到数据库中。
Deployment deploy = repositoryService.createDeployment()
.name("出差申请流程")
.addClasspathResource("bpmn/evection.bpmn")
.addClasspathResource("bpmn/evection.png")
.deploy();
// 4.输出部署信息

System.out.println("流程部署id="+deploy.getId());
System.out.println("流程部署名字="+deploy.getName());



}
用zip文件批量部署,不指定部署名称。
@Test
public void deployProcessByZip(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip"))).deploy();

System.out.println(deployment.getId());
System.out.println(deployment.getName());
}


有两个表的新增操作需要说明一下:
ACT_RE_DEPLOYMENT:流程部署表,每部署一次会增加一条记录
ACT_RE_PROCDEF,流程定义表,这两个表是一对一的关系
ACT_GE_BYTEARRAY:流程资源表,刚才的bpmn和png就保存在这个,数据类型为BLOB二进制数据
9.启动流程实例runtimeService.根据流程定义的key启动
startProcessInstanceByKey("myProcess_1"),
操作的表:act_hi_actinst 流程实例执行历史信息
     act_hi_identifylink 流程参与用于的历史信息
    act_hi_procinst 流程任务的历史信息
    act_hi_taskinst 流程任务的历信息
    act_ru_execution 流程执行任务
    act_ru_identitylink 流程正在参与的用户信息
    act_ru_task 流程当前任务信息



任务查询:taskService.流程key+任务的负责人
createTaskQuery().processDefinitionKey("myProcess_1")
.taskAssignee("zhangsan")
.list();
任务完成
taskService.complete(task.getId());
10、Activiti架构、类关系
获取proceEngine两种方式:
  1.通过ProcessEngines.getDefaultProcessEngine();前提是配置文件名称必须为activiti.cfg.xml,bean的名字必须为processEngineConfiguration
  2.通过ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration")
        .buildProcessEngine();可以指定配置文件的名称还有bean的名称

processEngine:流程引擎,用于获取各种服务接口。
服务接口:用户流程的部署,执行、管理,就是用这些接口操作对应的数据库表
RepositoryService 资源管理类
RuntimeService 运行时管理类
TaskService 任务管理类
HistoryService 历史任务管理类
ManagementService 流程引擎管理类
11.流程符号、画流程图
流程符号:时间event、活动Activity、网关GateWay、流向
使用流程设计器画出流程图
创建bpmn文件(本质就是xml文件,因为安装了activitiBPM插件才能可视化操作流程内容),在流程设计器中使用流程符号来表达流程,指定流程的key,指定流程负责人
生成PNG文件:把bpmn文件后缀改为xml,在文件上右键选择Diagrams=》showBPMN2.0 Desinger,打开创建,点击导出文件类型选择为png,要注意乱码问题
12.activiti的api练习结束。实际工作中,需要把自己的业务表和Activiti的表进行关联,才能真正完成实际的业务,是和Activiti表中的一个字段BusinessKey=1.

总结:
1.流程定义查询:根据流程定义的key,查询流程定义的信息
2.流程删除,使用deployment删除流程
3.流程资源下载,其他用户想要查看流程的资源,可以把数据库中的资源下载到本地
4.历史信息查询,HistoryService
5.流程定义和流程实例:一个流程定义可以对应多个流程实例。出差申请流程=流程定义,公司职员申请出差就是流程实例,例如小张,小李出差。
6.业务标识BusinessKey:可以查询自己的业务表信息。(非act表)RuntimeService.startProcessInstanceByKey("definitionKey","BusinessKey")
7.挂起、激活实例:单个操作:操作流程实例,某个流程实例挂起后,则此流程不再继续执行,使用RuntimeService.createProcessInstanceQuery,如果想完成该实例会报错。
         全部实例操作:操作流程定义。流程定义挂起后,则不允许添加新的流程实例,同时该流程定义下的所有流程实例全部执行挂起。


Activiti流程变量数据类型:
  String,Integer,Short,long,double,boolean,binary,serializable,date.如果将pojo存储到流程变量中,那么它必须实现序列化接口serializable,为了防止新增字段无法反序列化,需要生成serialVesionUID。
流程变量的使用方式(uel表达式:${}):在属性上使用变量作为assignee,在连线上使用${day3>3决定流程走向}
流程变量作用域:一个流程实例,或者一个任务,一个执行实例,默认作用域为流程实例,当一个流程变量作用域为global的时候可以称他为Global变量,global变量名不允许重复,设置相同名称的变量,后面设置的会覆盖前面设置的值。
        当作用域为任务或者是执行实例是流程变量称之为local变量,作用域互不影响,变量名可以相同没有影响。

如果分支连线没有设置条件,会走sequenceFlow id=小的那一条线。

组任务流程定义的时候,看下xml文件里面有没有指定assginee,指定了直接删除掉,不然会报空
 
网关:排他网关ExcluesiveGateway:会走true的那条连线,如果多条连线都为true那么就走id较小的一条去执行,当条件都不满足的时候会报错,连线条件的是直接结束流程,这有一点不同。
   并行网关ParallelGateway:网关不会解析条件。所有的分支都会走,等到所有的分支都执行完成再汇聚,一般进一个出一个。
·   包含网关InclusiveGateway:会走为true的条件,和无条件始终为true的多条分支,
等到所有的分支都执行完成再汇聚,一般进一个出一个。


 事件网关:EventGateway:略  


整合略:
Activiti整合spring
Activiti整合springboot
activiti7会自动继承springsecurity,activiti7会自动帮我们部署流程,前提就是bpmn文件放在resources下的processes文件中。

标签:定义,bpmn,--,流程,activiti,实例,入门
来源: https://www.cnblogs.com/handsomemj/p/15597831.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有