主要的六個概念:
流程定義 流程實例 流程變量 任務 起始結束 網關
ProcessEngine 線程安全 是Activiti5的核心,所有的服務都需要通過ProcessEngine來創建
Activiti5的持久化層採用的是Mybatis
通過ProcessEngine創建的7個service:
repositoryService(持久化服務) 與數據庫進行交互的
runtimeService(運行時服務) 與運行流程有關
formService(表單服務)
identityService(身份信息)
taskService(任務服務) 與流程中的每一個步驟有關
historyService(歷史信息) 查看歷史的流程步驟
managementService(管理定時任務)在固定的時間點完成固定的任務
**
表結構
**
act_ge_bytearray二進制數據表
act_ge_property屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,
act_hi_actinst歷史節點表 ****
act_hi_attachment歷史附件表
act_hi_comment歷史意見表
act_hi_identitylink歷史流程人員表
act_hi_detail歷史詳情表,提供歷史變量的查詢
act_hi_procinst歷史流程實例表****
act_hi_taskinst歷史任務實例表****
act_hi_varinst歷史變量表
act_id_group用戶組信息表
act_id_info用戶擴展信息表
act_id_membership用戶與用戶組對應信息表
act_id_user用戶信息表
act_re_deployment部署信息表
act_re_model流程設計模型部署表
act_re_procdef流程定義數據表
act_ru_event_subscr throwEvent、catchEvent時間監聽信息表
act_ru_execution運行時流程執行實例表****
act_ru_identitylink運行時流程人員表,主要存儲任務節點與參與者的相關信息
act_ru_job運行時定時任務數據表
act_ru_task運行時任務節點表
act_ru_variable運行時流程變量數據表
act_ge_bytearray二進制數據表
act_ge_property屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄,
act_hi_actinst歷史節點表
act_hi_attachment歷史附件表
act_hi_comment歷史意見表
act_hi_identitylink歷史流程人員表
act_hi_detail歷史詳情表,提供歷史變量的查詢
act_hi_procinst歷史流程實例表
act_hi_taskinst歷史任務實例表
act_hi_varinst歷史變量表
act_id_group用戶組信息表
act_id_info用戶擴展信息表
act_id_membership用戶與用戶組對應信息表
act_id_user用戶信息表
act_re_deployment部署信息表
act_re_model流程設計模型部署表
act_re_procdef流程定義數據表
act_ru_event_subscr throwEvent、catchEvent時間監聽信息表
act_ru_execution運行時流程執行實例表
act_ru_identitylink運行時流程人員表,主要存儲任務節點與參與者的相關信息
act_ru_job運行時定時任務數據表
act_ru_task運行時任務節點表****
act_ru_variable運行時流程變量數據表
**
基本使用
配置好後 可以直接注入對象使用
**
(1)部署: 在process文件夾下放bpmn文件
Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
部署後:
1act_ge_bytearray表
二進制數據表,存儲了流程定義圖形的XML文件和圖片信息
保存流程定義的xml信息
保存流程定義的圖片
2.act_re_deployment
部署信息表,存儲了部署的相關信息(部署時間)
3.act_re_procdef
流程定義數據表,存儲了當前流程圖形的相關信息(id,name,版本號)
如果有亂碼:
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer{
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName("宋體");
processEngineConfiguration.setLabelFontName("宋體");
}
}
查詢流程部署數據:
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
/*List<ProcessDefinition> list = query.list();
for (ProcessDefinition pd : list) {
System.out.println(pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
}*/
long count = query.count(); //流程定義的數量
//ProcessDefinition singleResult = query.latestVersion().singleResult();//獲取最後一次部署的流程定義對象
//System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
/*ProcessDefinitionQuery processDefinitionQuery = query.orderByProcessDefinitionVersion().desc();//根據版本號進行倒序排序
List<ProcessDefinition> list2 = processDefinitionQuery.list();
for (ProcessDefinition pd : list2) {
System.out.println("---"+pd.getId() +" - " + pd.getName() + " - " + pd.getVersion());
}*/
//query.listPage(firstResult, maxResults);//分頁的方法
ProcessDefinition singleResult = query.processDefinitionKey("myProcess").latestVersion().singleResult();
System.out.println(singleResult.getId() +" - " + singleResult.getName() + " - " + singleResult.getVersion());
(2)啓動流程實例:
//查詢流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("你的key")
.latestVersion()
.singleResult();
//運行啓動流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
//可以進行輸出
相關表哥:
act_ru_execution : 運行時流程執行實例表
act_ru_task : 運行時任務節點表
act_hi_procinst : 歷史流程實例表
act_hi_taskinst : 歷史任務實例表
act_hi_actinst : 歷史節點列表,把每一個執行過的節點數據保存
(3)獲取流程任務
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list1 = taskQuery.taskAssignee("名字").list();
List<Task> list2 = taskQuery.taskAssignee("名字").list();
for (Task task : list1) {
System.out.println("1的任務="+task.getName());
}
for (Task task : list2) {
System.out.println("2的任務="+task.getName());
}
(4)查詢並完成任務:
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list1 = taskQuery.taskAssignee("1").list();
List<Task> list2 = taskQuery.taskAssignee("2").list();
for (Task task : list1) {
System.out.println("1的任務="+task.getName());
taskService.complete(task.getId());
}
(5)歷史任務:
//查詢流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("你的key")
.latestVersion()
.singleResult();
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance historicProcessInstance =
query.processInstanceId("401").finished().singleResult();
//HistoricProcessInstanceEntity[superProcessInstanceId=null]
//finished() 判斷流程實例是否完成狀態,如果是完成狀態會返回歷史流程實例對象,否則爲null
(6)對任務進行領取:
TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> list = taskQuery.taskCandidateGroup("組名字").list();
for (Task task : list) {
taskService.claim(task.getId(), "人"); //領取任務
}
(7)採用流程變量獲取委託人:
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("設置好的流程變量1", "人1");
variables.put("設置好的流程變量2", "人2");
//ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId());
ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
System.out.println(processInstance);
(8)排他網關: 多個分支只能有一個被執行
Deployment deploy =
repositoryService.createDeployment().addClasspathResource("你的文件.bpmn").deploy();
System.out.println(deploy);
//查詢流程定義
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//準備流程變量
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("days", 3);
//啓動流程,傳遞流程變量
ProcessInstance processInstance =
runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
List<Task> list = taskService.createTaskQuery().taskAssignee("任命").list();
for (Task task : list) {
taskService.complete(task.getId());
}
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
並行網關:多個分支同時都被執行,流程才能往後執行 ,稱爲並行網關
Deployment deploy =
repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
//查詢流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//啓動流程,傳遞流程變量
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
List<Task> list1 = taskService().createTaskQuery().taskAssignee("人1").list();
List<Task> list2 = taskService().createTaskQuery().taskAssignee("人2").list();
for (Task task : list1) {
taskService().complete(task.getId());
}
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
for (Task task : list2) {
processEngine.getTaskService().complete(task.getId());
}
historicProcessInstance = historyService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
包含網關 :相當於 排他 加 並行網關
如果當前條件只有一個成立則執行後續流程-相當於排他網關
如果當前所有條件成立,則必須所有條件成立的任務完成纔會執行後續流程-相當於並行網關
Deployment deploy = repositoryService.createDeployment().addClasspathResource("文件.bpmn").deploy();
//查詢流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("key")
.latestVersion()
.singleResult();
//準備流程變量
Map<String,Object> variables = new HashMap<String,Object>();
//variables.put("days", 5);//條件:days>3
//variables.put("cost", 100); //條件:cost>5000
variables.put("days", 5);//條件:days>3
variables.put("cost", 10000); //條件:cost>5000
//啓動流程,傳遞流程變量
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(),variables);
List<Task> list = taskService.createTaskQuery().taskAssignee("人1").list();
for (Task task : list) {
taskService.complete(task.getId());
}
HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.singleResult();
(9)流程監聽器:
寫兩個類實現 ExecutionListener
選擇結束節點 加監聽器
//部署流程
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("key");
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskAssignee("人1").list();
for ( Task task : tasks ) {
taskService.setVariable(task.getId(), "flg", false);
taskService.complete(task.getId());
}
、、