之前看某招聘软件上好多需要有Activiti开发经验,所以学习一下.主要先弄清楚基本操作, 在此记录一下.
画图:
首先需要导入插件actiBPM(如果IDEA搜不到的话可以去IDEA官网下载插件然后导入):
导入插件后就会发现在创建文件时有一个BPMNFile选项:
创建BPMNFile文件并取名就可以开始画图了:
右边就是可选择的图标,直接拖在中间即可(想吐槽一下移动的时候不显示移动后的位置,想对准需要对好几次).将两个模块连接需要点击方块中间的点然后往下拉,拉到目标方块.
画图的时候你会发现左边有表格,这个表格会存储到数据库中,这个Id后面会用到:
完善一下流程图:
画完图后将bpmn后缀改为xml,右键选择Diagrams
此处可能会出现乱码问题,这个问题需要修改idea的配置文件:
在这两个文件中最后一行添加: -Dfile.encoding=UTF-8.
重启idea在再打开就正常了,点击保存,保存到自定义目录下,就会生成.xml.uml文件:
建表:
依赖:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
方式1 测试类配置:
public class ActivitiTest {
@Test
public void test() {
//创建引擎配置对象
ProcessEngineConfiguration configuration
= ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
//生成表数据
configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti");
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("root");
/**
DB_SCHEMA_UPDATE_FALSE = "false"; 建表时表格不存在报异常
DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop"; 如果存在则删除后重新创建
DB_SCHEMA_UPDATE_TRUE = "true"; 不存在则创建 存在则使用
*/
//设置表生成策略
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//执行
ProcessEngine processEngine = configuration.buildProcessEngine();
}
}
方式2 xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:spring="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
然后在class中
public void activitiTest(){
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
}
执行后生成23张表:
re和ru:正在执行的流程信息相关表
hi:已经执行完毕的流程相关信息
ge: 存储资源(图片,xml等)
evt:
部署流程
直接上代码吧:
@Test
public void buildActiviti(){
//获取流程引擎对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
//基于流程引擎获取流程部署对象
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
//通过部署对象部署流程图
DeploymentBuilder deploy = repositoryService.createDeployment();
//部署
Deployment deployment = deploy.name("测试流程").addClasspathResource("11.bpmn").addClasspathResource("11.xml.uml").deploy();
//输出信息
System.out.println(deployment.getId());
}
需要注意的是
- 几个文件必须在resources目录下
- 文件必须以bpmn或者bpmn20.xml结尾,否则act_re_procdef表中会没有数据.
查看数据库会发现多了一些数据:
act_re_deployment: 流程部署基本信息表
act_re_procdef: 流程部署定义表,和信息表是1v1的关系
act_ge_bytearray: 流程图信息表,记录图片,xml等信息
提交两次相同的流程信息在数据库中会生成一个流程数据.这样设定的原因是实际应用中会涉及到流程升级,例如需要添加某个流程,可以看一下数据库.
可以看到两条数据Version是不同的,而流程升级后再次访问时会优先选择version高的版本.
启动流程:
@Test
public void startActiviti(){
//获取流程引擎对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
ProcessInstance myProcess = runtimeService.startProcessInstanceByKey("myProcess_1");
//打印相关信息
System.out.println(myProcess.getId());
System.out.println(myProcess.getProcessDefinitionId());
}
myProcess_1这个就是画图时表格中指定的Id.
再次查看数据库:
act_ru_execution: 流程实例信息表
act_ru_task: 记录当前执行到哪个任务节点
会发现这两个表会有流程相关信息,一个流程只有一条记录,例如1个人申请请假他所在的流程在数据库中是只有一条记录的,但2人请假则是两条流程,会产生两条记录.
执行任务节点
可以先查询,获取任务相关信息
@Test
public void queryTask(){
//获取流程引擎对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().list();
for (Task task : list) {
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getAssignee());
System.out.println(task.getProcessInstanceId());
}
}
获取到之后执行:
@Test
public void handlerTask(){
//获取流程引擎对象
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = defaultProcessEngine.getTaskService();
taskService.complete("15002");
}
每执行一次complete方法流程会往后走一步,直到结束会提示找不到该任务Id.
我们在act_hi_actinst表中可以看到是按照流程顺序执行的:
本文只是入门篇,大家也会发现代码比较冗余,重复很多,进阶版的等以后实际应用后再来更新吧,如果有帮助的话可以点个赞哦~
最后十分想吐槽actiBpm这个插件太难用了,其实我想继续学下去的,奈何跟着eclipse的教程实在是差距太大,eclipse的activiti插件是比较友好的,idea感觉没人更新…
比如拖拽箭头是这样的:
全是残影
再比如我在驳回时想返回startEvent 发现没法画出来,和向下的箭头重合了,根本连不上:
还有对于处理人的相关逻辑都不知道如何配置…