今天学习使用了Activiti,使用过程中的一些认识写出来。
https://www.activiti.org/download-links
首先就是下载源码包,使用的是5.22.0,下载好之后直接去Navicat Premuim创建数据库,执行sql,但是不知道为什么只有23张表,没有act_evt_log表与act_procdef_info两张表,然后使用IDEA通过java代码创建了表,这次是25张表。导入jar包,创建spring-config资源文件,然后执行测试代码。@Test
public void createTable() {
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//ProcessEngines.getDefaultProcessEngine();
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
导入actiBPM插件的时候,如果File->Settings->Plugins没有找到actiBPM,可以选择下方Browse repositories搜索,这时还有可能直接下载不成功,显示不能连接官网,可以复制网址浏览器打开,直接下载,然后下载好之后,选择Install plugin from disk,找到刚才的jar包路径,下载成功,这时可以创建BPMN file,也就是activiti工作流的流程图。
创建一个测试类,并且创建全局变量processEngine流程引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//创建流程引擎,之后的步骤需要用到
ProcessEngine processEngine = configuration.buildProcessEngine();
添加测试方法,启动一个流程,运行之后,act_hi_taskinst,act_ru_task,act_ru_execution三张表都会自动添加一条数据。hi是历史记录,会根据操作增加数据,ru记录运行时程序,会根据操作更新数据
@Test
public void startProcess() {
//启动一个流程
RuntimeService runtimeService = processEngine.getRuntimeService();
//key是bpmn的id,根据bpmn文件而定,act_re_procdef中的KEY_,
runtimeService.startProcessInstanceByKey("leave1801");
}
这时可以查询出来流程的某些操作数据,如果开启两个流程,list的size就是2,这里需注意如果同时有打印语句与提交流程语句,那么控制台不会输出要打印的数据,但是数据库已经被提交更新。如果需要查看流程的一些数据,可以注释掉提交语句。act_hi_taskinst表增加对应流程数的数据,act_ru_task更新为当前流程,act_ru_execution也是会更新为当前流程
@Test
public void queryZhangSanTask() {
String assignee = "chang";
List taskList = processEngine.getTaskService()//获取任务service
.createTaskQuery()//创建查询对象
.taskAssignee(assignee)//指定查询人
.list();
for (Task task : taskList) {
System.out.println("代办任务ID:" + task.getId());
System.out.println("代办任务name:" + task.getName());
System.out.println("代办任务创建时间:" + task.getCreateTime());
System.out.println("代办任务办理人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("执行对象ID:" + task.getExecutionId());
//提交任务到下一个代理人,如果存在这一句,上面不会输出打印,即便assignee是当前的执行人也不会打印,但是数据库中数据已经改变
//如果assignee不是当前执行人,即便没有下面这一句,也查询不到数据,因为当前不是这个人
//当全部流程执行结束,
processEngine.getTaskService().complete(task.getId());
}
}
当提交完当前操作人的操作之后,更改下面数据,根据bpmn文件中写的流程assignee数据。
String assignee = "meng";
当全部流程操作结束之后,会发现act_ru_task,act_ru_execution两张表中对应流程的数据被删除,act_hi_taskinst表记录了完整流程数据。此时可以查看完整流程的起止时间。processInstanceId("")中根据act_hi_taskinst表中PROC_INST_ID_字段值确定。
@Test
public void viewHistory() {
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance =
historyService
.createHistoricProcessInstanceQuery()
.processInstanceId("12501").singleResult();
System.out.println("开始时间:" + historicProcessInstance.getStartTime());
System.out.println("结束时间:" + historicProcessInstance.getEndTime());
}