定义工作流程图
要使用 activiti ,当然要先画好流程图。创建一个 bpmn 文件,本例流程图如下:
流程定义好后,中文可能会乱码。如何解决中文乱码呢:
1)找到 IDEA 的安装路径,打开 .vmoptions 文件,在末尾加入一行
-Dfile.encoding=UTF-8
2)在这两个文件加了上面这句如果还没解决,打开下图的文件也加入这句。
3)如果还不行,请重启开发工具;如果还不行,请重启电脑;再不行,我也没辙了,只能问度娘了
我就是重启了电脑后才不乱码的
流程定义的部署
定义好流程后,需要部署到 activiti 引擎中;在部署前,需要准备流程图的 bpmn 文件和 png 文件。在 eclipse 中,可以把 bpmn 文件直接保存为 png 格式。
在 IDEA 中,需通过 xml 文件转化一下:
a.选中 bpmn 文件,ctrl + c ,ctrl + v ,直接把复制的文件改为 .xml
b.用 bpmn 打开该 xml 文件
c.另存为 .png 文件,放到项目中即可。
准备好流程图后,开始部署,步骤如下:
1)得到ProcessEngine对象
2)得到RepositoryService对象
3)进行部署
4)输出部署的相关信息
/**
* 流程定义的部署
*/
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_process.bpmn")
.addClasspathResource("diagram/holiday_process.png")
.name("请假申请流程").deploy();
//4、查看结果
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
}
涉及的activiti表,执行上面的 main 方法,下面三个表会保存流程的定义信息
act_re_deployment : 部署信息
act_re_procdef : 流程定义的相关信息
act_ge_bytearray : 流程定义的bpmn文件及png文件
第二种部署方式:zip 包部署
//新建文件夹,把 .bpmn 文件和 .png 文件放入文件夹,再把改文件夹压缩成 zip 包
public static void deployedByZip() {
//1、创建 ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取 RepositoryService 实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、读取文件并创建 zip 流
InputStream inputStream = ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holiday_process.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
//4、部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请流程").deploy();
//5、查看结果
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
流程实例的启动
要启动流程,首先必须已经完成流程定义的部署工作
1)得到 ProcessEngine 对象
2)得到 RuntimeService 对象
3)启动流程,创建流程实例,需要知道流程定义的 key
获取key的方法:
a. 查看 act_re_procdef 表中的字段 key;
b. 在IDE中查看.bpmn文件的id属性
public static void startInstance() {
//1、获取 ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取 RuntimeService 对象
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、创建流程实例,需要流程定义的 key
ProcessInstance holiday_process = runtimeService.startProcessInstanceByKey("holiday_process");
System.out.println("流程部署ID===="+holiday_process.getDeploymentId());
System.out.println("流程定义ID===="+holiday_process.getProcessDefinitionId());
System.out.println("流程实例ID===="+holiday_process.getId());
System.out.println("运行中流程ID===="+holiday_process.getActivityId());
}
涉及的activiti表,启动流程后,在如下的表中会增加会更新数据
act_hi_actinst:已完成的活动信息
act_hi_identitylink:参与者信息
act_hi_procinst:流程实例
act_hi_taskinst:任务实例
act_ru_execution:执行表
act_ru_identitylink:参与者信息
act_ru_task:任务
任务查询
查询任务首先需要知道查谁的任务,因为流程刚启动,当然是先查第一个节点的任务操作人了。
本例中是 Tom 需要填写请假条
public static void findTaskList() {
//1、获取 ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取 TaskService 对象
TaskService taskService = processEngine.getTaskService();
//3、根据 key 和 当前实例任务负责人 进行查询
List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("holiday_process")
.taskAssignee("Tom").list();
//查看
for (Task task: taskList) {
System.out.println("流程实例ID====" + task.getProcessInstanceId());
System.out.println("任务ID====" + task.getId());
System.out.println("任务名称====" + task.getName());
System.out.println("任务负责人====" + task.getAssignee());
}
}
处理任务
查询到任务后,就可以处理任务,只要把任务 id 出入即可完成任务
1)得到 ProcessEngine 对象
2)得到 TaskService 对象
3)传入任务ID,处理任务
public static void handTask() {
//1、获取 ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、获取 TaskService 对象
TaskService taskService = processEngine.getTaskService();
//3、处理任务,传入任务ID
taskService.complete("5005");
}
任务处理会更新如下表的数据:
act_hi_actinst:当前任务有了结束时间,并插入了下一条待办任务
act_hi_identitylink:增加了一条数据
act_hi_taskinst:当前任务有了结束时间,并插入了下一条待办任务
act_ru_identitylink:增加了一条数据
act_ru_task:删除了已完成的任务,只有一条等待处理的任务;如果该流程任务都完成了,则没有数据了;act_ru*同理,结束了就不属于运行时了
到这里,Tom 就写好请假条并提交了,Tom 的任务算完成了,等着领导同意就行啦
以上,就是最简单的 activiti7 快速体验了