工作流程框架Activiti5
在我們實際的項目開發中,有時業務流程很複雜,類似的業務也很多。這樣我們開發起來就會很複雜。像我們練習的衆籌網項目中的資質認證模塊,開發時的功能不過就是簡單的增刪改查,可是業務流程很繁瑣,同時又有很多種情況。如果我們不使用工具自己來開發的話就會很麻煩!這時我們就需要使用工作流程框架啦!Activiti5正是工作流程框架中一個比較常用的開源框架。他可以使我們在開發複雜業務流程時非常簡單。
那我們這就先來簡單瞭解一下Activiti5如何使用吧!
流程定義 ProcessDefinition:定義某些流程的順序結構;定義一個流程;
流程實例 ProcessInstance:實例化一個流程,(啓動一次流程);
流程變量 Process variable:流程運行期間的一些數據
任務 Task:流程執行到的需要具體的執行一個任務(某個任務);
ProcessEngine這個類是Activiti5的核心,所有的服務都需要通過ProcessEngine來創建,該類是線程安全的
Activiti5的持久化層採用的是Mybatis,這樣移植性好
Activiti5主要包括7個Service(7個服務組件),這些Service都是通過ProcessEngine創建
- repositoryService(持久化服務):操作數據庫完成流程部署,流程定義保存等工作;
- runtimeService(運行時服務):在流程運行期間可以獲取到流程的所有信息,控制流程啓動停止等。
- formService(表單服務):是一個可選的;實際開發也是不用的;就是流程運行時需要的數據利用表單提交過來;用自己的業務控制表單:html
- The FormService is an optional service. Meaning that Activiti can perfectly be used without it, without sacrificing any functionality.
- identityService(身份信息):來管理流程框架中的用戶,分組信息等;
- The IdentityService is pretty simple. It allows the management (creation, update, deletion, querying, …) of groups and users
- taskService(任務服務):負責流程期間任務的簽收處理,以及完成任務等工作;
-
Everything around tasks is grouped in the TaskService, such as
- historyService(歷史信息):流程運行的歷史信息;
- managementService(管理定時任務):
- The ManagementService is typically not needed when coding custom application using Activiti.
運行期間經常進行一些CRUD;運行期間這些表中的數據總是很少,CRUD非常快;
概念我瞭解的差不多啦!接下來我們看看如何使用。
1,安裝流程設計框架activiti5的插件。先解壓插件壓縮包,將壓縮包中的兩個文件夾拷貝到eclipse的安裝目錄下,然後重啓eclipse就可以啦!很簡單!
重啓eclipse後在新建中看看是否可以創建activiti項目?如果可以表示安裝成功!
2,測試。新建或者隨便找一個maven工程來測試activiti。
①,導包,在maven工程的pom文件中添加依賴。這裏也添加了mysql的依賴,因爲activiti也是需要數據庫保存數據的,我們要自定義activiti的數據保存在mysql中。
<!--測試activiti -->
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.22.0</version>
</dependency>
<!-- 導入mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
</dependencies>
②寫配置。在maven項目中創建spring的配置文件,拷貝相關配置信息並修改。創建源碼包,用於保存之後創建的流程設計文件。
上圖中mysql的配置,是爲了指定activiti將數據保存在mysql中,單獨新創建的activiti_db數據庫。
③,測試。
package com.atguigu.activiti.test;
import static org.junit.Assert.*;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest {
// 引擎只有一個即可
// 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
//服務組件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任務服務組件:完成任務,簽收任務等...
taskService = processEngine.getTaskService();
// 運行時服務組件:查詢流程運行期間一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服務組件:負責保存流程定義信息等
repositoryService = processEngine.getRepositoryService();
// 管理組件,監聽流程、定時任務等...
managementService = processEngine.getManagementService();
// 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
identityService = processEngine.getIdentityService();
// 查詢流程歷史記錄等信息;歷史組件
historyService = processEngine.getHistoryService();
// 表單組件:沒用
formService = processEngine.getFormService();
}
@Test
public void test() {
System.out.println("流程引擎:"+processEngine);
System.out.println("其他組件:");
}
}
1、流程框架第一次給數據庫中建表,這個表有數據;(存儲當前activiti版本信息等)
3、在文件的空白處點一下;去properties標籤中可以填寫當前流程的一些定義(介紹)信息
@Test
public void testProcessDefinetionDeployee() {
// 1、如何定義一個流程;(畫流程圖);
// 2、部署這個定義好的流程;
// 3、部署:去數據庫保存這個流程定義的信息
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("process/請假流程.bpmn")
.deploy();
System.out.println("部署的流程deploy對象"+deploy);
}
部署(流程部署信息的保存);部署的信息:某一天部署了什麼東西
procdef:Procecss Definetion:流程定義;
流程定義:ProcessDefinetion;流程信息保存;
流程實例:啓動某個流程就是爲這個流程創建一個流程實例;運行期間的數據都在ru表中
taskService.claim(task.getId(), "zhangsan");簽收
taskService.complete(task.getId());完成
使用${}取出某些變量的值,用來做判斷,做任務派發等....
流程變量如果使用form表單申明的方式:變量的類型必須是以下幾種;
{date, boolean, string, double, long}
①,排他網關
相當於if()...else if();只會有一個分支到達。
選中網關與任務之間的連線後,可以填寫判斷條件。
②,並行網關
必須等待所有的分支都完成,匯聚任務才能完成,自動進行下一步;(注意要有起始和匯聚成對出現)
/**
* 並行網關,必須所有匯聚點的分支都完成纔可以
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
// gov-process:1:87504
public void test04() {
List<Task> list = taskService.createTaskQuery().processDefinitionId("gov-process:1:87504").list();
int i = 0;
for (Task task : list) {
System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
// 完成任務
taskService.complete(task.getId());
//if ((i++) % 2 == 0) {
// System.out.println("當前要完成的任務。"+task.getId() + ";任務名:" + task.getName());
// taskService.complete(task.getId());
//}
}
// List<HistoricProcessInstance> list2 = historyService.createHistoricProcessInstanceQuery().finished().list();
// for (HistoricProcessInstance historicProcessInstance : list2) {
// System.out.println(historicProcessInstance);
// }
//看這個流程是否完成了;
long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:1:87504").finished().count();
System.out.println(count);
}
這裏是所有聯繫的代碼:
import static org.junit.Assert.*;
import java.util.List;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest {
// 引擎只有一個即可
// 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
// 服務組件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
// 部署流程,查詢部署信息等...
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任務服務組件:完成任務,簽收任務等...
taskService = processEngine.getTaskService();
// 運行時服務組件:查詢流程運行期間一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服務組件:負責保存流程定義信息等
repositoryService = processEngine.getRepositoryService();
// 管理組件,監聽流程、定時任務等...
managementService = processEngine.getManagementService();
// 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
identityService = processEngine.getIdentityService();
// 查詢流程歷史記錄等信息;歷史組件
historyService = processEngine.getHistoryService();
// 表單組件:沒用
formService = processEngine.getFormService();
}
@Test
public void test() {
System.out.println("流程引擎:" + processEngine);
System.out.println("其他組件:");
}
/**
* 測試來定義一個流程,並把流程的定義信息保存在數據庫中 1、每次流程圖有修改以後,我們都需要重新部署,流程引擎才能用到新的流程 2、以前舊的流程都是存儲在數據庫中,新的流程也要存在數據庫中
* 3、每次部署都會保存一個新的流程定義;act_re_procdef 4、同一個流程多次部署相當於只是版本疊加; 5、流程定義的key是用來識別版本是否疊加的;
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testProcessDefinetionDeployee() {
// 1、如何定義一個流程;(畫流程圖);
// 2、部署這個定義好的流程;
// 3、部署:去數據庫保存這個流程定義的信息
Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/請假流程新的.bpmn").deploy();
System.out.println("部署的流程deploy對象" + deploy.getId());
}
/**
* 查詢所有的流程信息repositoryService
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testQueryProcessDefinetion() {
// 查部署信息;
// DeploymentQuery query = repositoryService.createDeploymentQuery();
// 查流程定義;
// 每次部署都有一個部署id:id=12501
// 也可以用流程的唯一標示:id=myProcess01
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
// 拿到所有數據庫中的流程定義信息
long count = definitionQuery.count();
System.out.println("流程數量:" + count);
List<ProcessDefinition> list = definitionQuery.list();
for (ProcessDefinition processDefinition : list) {
System.out.println("流程id(流程框架生成的):" + processDefinition.getId());
System.out.println("流程name(畫流程時的流程名):" + processDefinition.getName());
System.out.println("流程的key(畫流程時的id):" + processDefinition.getKey());
System.out.println("流程的資源信息:" + processDefinition.getResourceName() + "==>"
+ processDefinition.getDiagramResourceName());
System.out.println("流程的版本號:" + processDefinition.getVersion());
System.out.println("=====================");
}
System.out.println("精確查詢......");
// //按照流程的id;按照流程的key;按照流程的版本
// ProcessDefinitionQuery d = definitionQuery.deploymentId("2501");
// System.out.println(d);
//
long count2 = definitionQuery.processDefinitionKeyLike("myProcess").count();
System.out.println(count2);
// System.out.println("版本:"+definition.getVersion()+"==>"+definition.getKey()+"==>"+definition.getName());
}
/**
* 一個流程定義可以創建多個流程實例;
*
* processInstance.getProcessDefinitionId():
* myProcess:4:7504
* myProcess:4:7504
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void test04() {
// 1、啓動一個請假流程;
// 2、查出我們要啓動的流程的信息;
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myProcess")
.latestVersion().singleResult();
System.out.println("流程的信息:"+definition.getId()+"==>"+definition.getName()+"===>"+definition.getKey());
//3、啓動這個流程;返回流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(definition.getId());
System.out.println("流程啓動成功!"+processInstance.getActivityId());
System.out.println(""+processInstance.getProcessDefinitionId());
}
/**
* 測試任務
* @Description (TODO這裏用一句話描述這個方法的作用)
* 1、查詢所有任務;
* 2、將任務簽收;(領任務完成任務)
*/
@Test
public void testTask(){
//1、查出當前系統有哪些任務;
//可以查某個流程當前走在了哪個任務:createTaskQuery().processDefinitionId("");
//可以查某個人現在需要做哪些任務;任務分配給了這些人;
//某個流程對應的所有任務
List<Task> list = taskService.createTaskQuery()
.processDefinitionId("myProcess:4:7504")
.list();
for (Task task : list) {
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務分給哪個人(由哪個人來處理):"+task.getAssignee());
System.out.println("任務名:"+task.getName());
String assignee = "zhangsan";
System.out.println("任務簽收;"+assignee+"簽收了:"+task.getId()+"");
taskService.claim(task.getId(), "zhangsan");
System.out.println("===================");
}
System.out.println("張三所要執行的任務...");
List<Task> list2 = taskService.createTaskQuery().taskAssignee("zhangsan").list();
for (Task task : list2) {
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務分給哪個人(由哪個人來處理):"+task.getAssignee());
System.out.println("任務名:"+task.getName());
}
}
/**
* 1、任務相關操作都是使用taskService;
* 2、claim、complete;簽收和完成
* 測試完成任務
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testTaskComplete(){
//1、查出張三擁有的任務;
long count1 = taskService.createTaskQuery().taskAssignee("zhangsan").count();
System.out.println("任務數量:"+count1);
System.out.println("=====================================");
List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").list();
for (Task task : list) {
//完成任務;
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務名:"+task.getName());
System.out.println("張三:完成任務"+task.getId());
taskService.complete(task.getId());
}
System.out.println("=====================================");
long count = taskService.createTaskQuery().taskAssignee("zhangsan").count();
System.out.println("任務數量:"+count);
}
@Test
public void testProceTask(){
//看當前流程執行到哪個任務了;
List<Task> list = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
for (Task task : list) {
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務名:"+task.getName());
taskService.complete(task.getId());
}
System.out.println("==================");
List<Task> list2 = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
for (Task task : list2) {
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務名:"+task.getName());
taskService.complete(task.getId());
}
System.out.println("==================");
List<Task> list3 = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
for (Task task : list3) {
System.out.println("當前的任務信息:id:"+task.getId());
System.out.println("任務名:"+task.getName());
//dsadsadsadsadsa
taskService.complete(task.getId());
}
}
}
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest02 {
// 引擎只有一個即可
// 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
// 服務組件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
// 部署流程,查詢部署信息等...
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任務服務組件:完成任務,簽收任務等...
taskService = processEngine.getTaskService();
// 運行時服務組件:查詢流程運行期間一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服務組件:負責保存流程定義信息等
repositoryService = processEngine.getRepositoryService();
// 管理組件,監聽流程、定時任務等...
managementService = processEngine.getManagementService();
// 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
identityService = processEngine.getIdentityService();
// 查詢流程歷史記錄等信息;歷史組件
historyService = processEngine.getHistoryService();
// 表單組件:沒用
formService = processEngine.getFormService();
}
/**
* 部署的信息:57501
* 部署的信息:65001
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void test() {
// 1、部署這個流程;
Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/01請假的帶變量版.bpmn")
.name("帶變量的流程部署").deploy();
System.out.println("部署的信息:" + deploy.getId());
System.out.println("" + deploy.getName());
}
/**
* 流程啓動完成:ProcessInstance[77501]
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testStart() {
// 1、啓動新版的請假流程;myprocess001:1:57504
//myprocess001:2:65004
// 啓動時設置一些流程變量;方便下個任務可以獲取;60001
Map<String, Object> map = new HashMap<String, Object>();
map.put("assigneer", "lisi");
ProcessInstance processInstance = runtimeService.startProcessInstanceById("myprocess001:2:65004", map);
System.out.println("流程啓動完成:"+processInstance);
}
@Test
public void testTask01(){
//1、使用lisi獲取到它要執行的任務
// List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").list();
// for (Task task : list) {
// System.out.println("任務名:"+task.getName()+"==>"+task.getId());
//
// }
Task task = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").taskAssignee("lisi").singleResult();
System.out.println("任務");
//任務有指定人去處理就不用簽收;
//強制簽收
// taskService.unclaim(task.getId());
// taskService.claim(taskId, userId);
System.out.println("任務名:"+task.getName()+"==>"+task.getId());
Map<String, Object> map = new HashMap<String, Object>();
map.put("days", 2);
// map.put("reasons", "我病了");
//map.put("requester", "lisi");
taskService.complete(task.getId(), map);
System.out.println("完成任務。。。");
}
@Test
public void test01(){
List<Task> list = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").list();
for (Task task : list) {
System.out.println("任務名:"+task.getName()+"==>"+task.getId());
}
List<Task> list2 = taskService.createTaskQuery().taskAssignee("wangwu").list();
for (Task task : list2) {
System.out.println("任務名:"+task.getName()+"==>"+task.getId());
taskService.complete(task.getId());
}
List<Task> list1 = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").list();
System.out.println("還有任務?"+list1);
}
}
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest03 {
// 引擎只有一個即可
// 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
// 服務組件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
// 部署流程,查詢部署信息等...
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任務服務組件:完成任務,簽收任務等...
taskService = processEngine.getTaskService();
// 運行時服務組件:查詢流程運行期間一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服務組件:負責保存流程定義信息等
repositoryService = processEngine.getRepositoryService();
// 管理組件,監聽流程、定時任務等...
managementService = processEngine.getManagementService();
// 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
identityService = processEngine.getIdentityService();
// 查詢流程歷史記錄等信息;歷史組件
historyService = processEngine.getHistoryService();
// 表單組件:沒用
formService = processEngine.getFormService();
}
/**
* 部署流程:部署的id:87501 流程定義的key:gov-process:1:87504
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testDeploy() {
Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/02政府審覈.bpmn").deploy();
System.out.println("本次的部署信息" + deploy);
}
/**
* 啓動流程實例
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testStartProcessInstance() {
// 1、查出所有流程,看哪一個是要啓動
ProcessInstance processInstance = runtimeService.startProcessInstanceById("gov-process:1:87504");
System.out.println("流程啓動成功!" + processInstance);
}
@Test
public void testTaskAssignee() {
List<Task> list = taskService.createTaskQuery().taskAssignee("leifengyang").list();
for (Task task : list) {
System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
// 完成任務
// ${isFoodCompany == true}
// ${money>1000000}
// ${isCurrent == true}
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("isFoodCompany", true);
variables.put("money", 1000001);
variables.put("isCurrent", true);
taskService.complete(task.getId(), variables);
}
}
/**
* 並行網關,必須所有匯聚點的分支都完成纔可以
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
// gov-process:1:87504
public void test04() {
List<Task> list = taskService.createTaskQuery().processDefinitionId("gov-process:1:87504").list();
int i = 0;
for (Task task : list) {
System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
// 完成任務
taskService.complete(task.getId());
//if ((i++) % 2 == 0) {
// System.out.println("當前要完成的任務。"+task.getId() + ";任務名:" + task.getName());
// taskService.complete(task.getId());
//}
}
// List<HistoricProcessInstance> list2 = historyService.createHistoricProcessInstanceQuery().finished().list();
// for (HistoricProcessInstance historicProcessInstance : list2) {
// System.out.println(historicProcessInstance);
// }
//看這個流程是否完成了;
long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:1:87504").finished().count();
System.out.println(count);
}
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;
public class ActivitiTest04 {
// 引擎只有一個即可
// 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
// 服務組件和流程引擎都是接口;
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService;
RuntimeService runtimeService;
// 部署流程,查詢部署信息等...
RepositoryService repositoryService;
ManagementService managementService;
IdentityService identityService;
HistoryService historyService;
FormService formService;
@Before
public void serviceInit() {
// 任務服務組件:完成任務,簽收任務等...
taskService = processEngine.getTaskService();
// 運行時服務組件:查詢流程運行期間一些信息,控制流程等
runtimeService = processEngine.getRuntimeService();
// 持久化服務組件:負責保存流程定義信息等
repositoryService = processEngine.getRepositoryService();
// 管理組件,監聽流程、定時任務等...
managementService = processEngine.getManagementService();
// 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
identityService = processEngine.getIdentityService();
// 查詢流程歷史記錄等信息;歷史組件
historyService = processEngine.getHistoryService();
// 表單組件:沒用
formService = processEngine.getFormService();
}
/**
* pd:gov-process:2:100004 pd:gov-process:3:105004
*
* @Description (TODO這裏用一句話描述這個方法的作用)
*/
@Test
public void testDeploy() {
Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/03政府審覈.bpmn").deploy();
System.out.println(deploy + "部署完成");
}
// 流程啓動:ProcessInstance[102501]
@Test
public void startProcess() {
ProcessInstance instance = runtimeService.startProcessInstanceById("gov-process:3:105004");
System.out.println("流程啓動:" + instance);
}
@Test
public void testTask() {
// 1、查詢流程有哪些任務
List<Task> pdTaskList = taskService.createTaskQuery().processDefinitionId("gov-process:3:105004").list();
System.out.println("流程任務:" + pdTaskList);
// 2、查詢你有哪些任務
List<Task> perTaskList = taskService.createTaskQuery().taskAssignee("admin").list();
System.out.println("admin我的任務");
for (Task task : perTaskList) {
System.out.println(task);
// 完成任務;
if (task.getId().equals("107504")) {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("money", 10001);
variables.put("mone", 10001);
// taskService.complete(task.getId(), variables);
System.out.println("完成任務:" + task);
}
}
}
@Test
public void testCompletion() {
List<Task> pdTaskList = taskService.createTaskQuery().processDefinitionId("gov-process:3:105004").list();
System.out.println("流程任務:" + pdTaskList);
for (Task task : pdTaskList) {
System.out.println("完成任務:"+task);
// if(task.getId().equals("115007")){
taskService.complete(task.getId());
// }
}
//查詢這個流程是否執行完成了
long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:3:105004").finished().count();
System.out.println("完成了?"+count);
}
}
這裏還有activiti5的插件和用戶手冊的壓縮包地址:https://download.csdn.net/download/qq_25106373/11246793
供大家方便下載。