其他分享
首页 > 其他分享> > activiti入门

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