一
1
知识点1-获取processEngine
学习了工作流的基础,processEngine,这个类是工作流的核心
产生方法:
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); ProcessEngine processEngine = configuration.buildProcessEngine();
第一种是便捷方式,但是要确保
- activiti配置文件名:activiti.cfg.xml
- bean的id为processEngineConfiguration
第二种是基本方式,其中createProcessEngineConfigurationFromResource中的参数名可以更改,后面还可以加参数,参数值为bean的类型为processEngineConfiguration的id
知识点2-常见问题
在运行项目的过程中产生的问题
- bpmn产生乱码的问题
- 无法显示BPMN Editor工具栏
- 数据库连接失败
解决方法
-
IDEA2020版本以前,可以在IDEA的bin目录下的idea64.exe.vmopition文件里添加
-Dfile.encoding=UTF-8
2020版本需要在help栏目下的edit custom vm options里加入上一段代码
-
需要将IDEA的主题设置为默认颜色
-
首先确保数据库连接url正确,其次要导入版本匹配的数据库连接依赖,最后就是要加入时区的参数
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean>
知识点3-流程部署以及流程实例化
流程的部署
/*
* 流程定义部署
* act_re_deployment 部署信息
* act_re_proadef 流程定义的信息
* act_ge_bytearray 流程定义的bpmn文件和png文件
* */
public class ActivitiDeployment {
public static void main(String[] args) {
//1.创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2得到RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")//添加资源
.addClasspathResource("diagram/holiday.png")
.name("请假申请流程")
.deploy();
//4.输出部署的信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
}
流程的实例化启动
/*
* 流程实例的启动
* */
public class ActivitiStartInstance {
public static void main(String[] args) {
//1.得到processengin对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到runtimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.创建实例流程,流程定义的key需要提前知道
ProcessInstance instance = runtimeService.startProcessInstanceByKey("holiday");
//4.输出实例的相关信息
System.out.println("流程部署id"+instance.getDeploymentId());
System.out.println("流程实例id"+instance.getId());
System.out.println("活动id"+instance.getActivityId());
}
}
2
知识点1-常用接口
常用的接口
RepositoryService | Activiti的资源管理类 |
---|---|
RuntimeService | Activiti的流程运行管理类 |
TaskService | Activiti的任务管理类 |
HistoryService | Activiti的历史管理类 |
ManagerService | Activiti的引擎管理类 |
知识点2-部署方式
- 使用bpmn文件和png文件
- 现将两个文件压缩成zip文件,然后使用zipinputstream读取
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")//添加资源
.addClasspathResource("diagram/holiday.png")
.name("请假申请流程")
.deploy();
知识点3-查询任务
使用taskService创建createTaskQuery查询器,给入ProcessD的key或者value,或者指定Assignee
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//得到taskservice对象
TaskService taskService = processEngine.getTaskService();
//根据流程定义的key负责人assignee来实现当前用户的任务列表查询
Task task = taskService.createTaskQuery()
.processDefinitionKey("holiday")
.taskAssignee("lisi")
// .list();
.singleResult();
//任务列表的展示
System.out.println("流程实例id"+task.getProcessInstanceId());
System.out.println("任务id"+task.getId());
System.out.println("任务负责人"+task.getAssignee());
System.out.println("任务名称"+task.getName());
知识点4-完成任务
taskService的complete方法
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
//处理任务,结合当前用户列表的查询操作,id 2505
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("holiday")
.taskAssignee("wangwu")
.list();
for (Task task : list) {
taskService.complete(task.getId());
}
知识点5-查询流程信息
需要获取一个查询器,设定查询条件
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//得到ProcessDefinitionQuery对象,该对象相当于查询器
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//设置条件,并查询出当前的所有流程的定义 查询条件:流程定义的key
List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday")
.orderByProcessDefinitionVersion()//设置排序方式.根据流程定义的版本号进行排序
.desc()
.list();
//输出流程定义信息
for (ProcessDefinition processDefinition : holiday) {
System.out.println("流程定义的id"+processDefinition.getId());
System.out.println("流程定义的名称"+processDefinition.getName());
System.out.println("流程定义的key"+processDefinition.getKey());
System.out.println("流程定义的版本号"+processDefinition.getVersion());
System.out.println("流程部署的id"+processDefinition.getDeploymentId());
}
}
知识点6-删除流程定义
注意事项
- 背后影响的表re开头的三张表bytearray,deployment,procdef
- 当我们正在执行的流程未完全审批结束时,此时如果要删除流程定义信息会失败
- 此时可以考虑使用级联删除,会先删除没有完成的节点,再删除流程,方法为设置deleteDeployment方法的第二个参数true,默认不写为false
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//创建RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//执行删除流程定义,需要传入部署id
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//设置条件,并查询出当前的所有流程的定义 查询条件:流程定义的key
List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday")
.orderByProcessDefinitionVersion()//设置排序方式.根据流程定义的版本号进行排序
.desc()
.list();
repositoryService.deleteDeployment(holiday.get(0).getDeploymentId());
知识点7-读取部署文件
作用:当用户想查询这个请假流程的步骤
方法:1.使用Activiti的API实现
2.使用jdbc操作
3.io流操作,使用commmons-io.jar包可以解决
使用io流
核心是读取文件并对接到输出流,读取文件的方法是
repositoryService .getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName())
processDefinition.getDiagramResourceName()代表获取图片资源,processDefinition.getResourceName()代表获取bpmn资源
//1.得到processengin对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到部署相关的service
RepositoryService repositoryService = processEngine