當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > activity工作流,這里讓你快速了解
Activity工作流的概念:就是“業(yè)務(wù)過(guò)程的部分或整體在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng)化”,它主要解決的是“使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或任務(wù)的過(guò)程自動(dòng)進(jìn)行,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實(shí)現(xiàn)”,業(yè)務(wù)過(guò)程中插入人工的執(zhí)行和干預(yù)。
ProcessEngine對(duì)象,這是Activity工作的核心。負(fù)責(zé)生成流程運(yùn)行時(shí)的各種實(shí)例及數(shù)據(jù)、監(jiān)控和管理流程的運(yùn)行。
一、Activity表設(shè)計(jì):
1、資源庫(kù)流程規(guī)則表
1)act_re_deployment 部署信息表
2)act_re_model 流程設(shè)計(jì)模型部署表
3)act_re_procdef 流程定義數(shù)據(jù)表
2、運(yùn)行時(shí)數(shù)據(jù)庫(kù)表
1)act_ru_execution 運(yùn)行時(shí)流程執(zhí)行實(shí)例表
2)act_ru_identitylink 運(yùn)行時(shí)流程人員表,主要存儲(chǔ)任務(wù)節(jié)點(diǎn)與參與者的相關(guān)信息
3)act_ru_task 運(yùn)行時(shí)任務(wù)節(jié)點(diǎn)表
4)act_ru_variable 運(yùn)行時(shí)流程變量數(shù)據(jù)表
3、歷史數(shù)據(jù)庫(kù)表
1)act_hi_actinst 歷史節(jié)點(diǎn)表
2)act_hi_attachment 歷史附件表
3)act_hi_comment 歷史意見(jiàn)表
4)act_hi_identitylink 歷史流程人員表
5)act_hi_detail 歷史詳情表,提供歷史變量的查詢
6)act_hi_procinst 歷史流程實(shí)例表
7)act_hi_taskinst 歷史任務(wù)實(shí)例表
8)act_hi_varinst 歷史變量表
4、組織機(jī)構(gòu)表
1)act_id_group 用戶組信息表
2)act_id_info 用戶擴(kuò)展信息表
3)act_id_membership 用戶與用戶組對(duì)應(yīng)信息表
4)act_id_user 用戶信息表
這四張表很常見(jiàn),基本的組織機(jī)構(gòu)管理,關(guān)于用戶認(rèn)證方面建議還是自己開(kāi)發(fā)一套,組件自帶的功能太簡(jiǎn)單,使用中有很多需求難以滿足
5、通用數(shù)據(jù)表
1)act_ge_bytearray 二進(jìn)制數(shù)據(jù)表
2)act_ge_property 屬性數(shù)據(jù)表存儲(chǔ)整個(gè)流程引擎級(jí)別的數(shù)據(jù),初始化表結(jié)構(gòu)時(shí),會(huì)默認(rèn)插入三條記錄。
二、activiti.cfg.xml(activiti的配置文件)
代碼:【
xmlns:context="//www.springframework.org/schema/context" xmlns:tx="//www.springframework.org/schema/tx"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd
//www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context-2.5.xsd
//www.springframework.org/schema/tx //www.springframework.org/schema/tx/spring-tx-3.0.xsd">
】
三、logging.properties(日志處理)
代碼:【
log4j.rootLogger=INFO, CA
# ConsoleAppender
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
】
四、創(chuàng)建表
【package junit;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class TestActiviti {
/**使用代碼創(chuàng)建工作流需要的張表*/
@Test
public void createTable(){
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//連接數(shù)據(jù)庫(kù)的配置
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/W_activiti_01?useUnicode=true&characterEncoding=utf8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("");
/**
public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自動(dòng)創(chuàng)建表,需要表存在
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先刪除表再創(chuàng)建表
public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自動(dòng)創(chuàng)建表
*/
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//工作流的核心對(duì)象,ProcessEnginee對(duì)象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
/**使用配置文件創(chuàng)建工作流需要的23張表*/
@Test
public void createTable_2(){
// ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
// //工作流的核心對(duì)象,ProcessEnginee對(duì)象
// ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") //
.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
}
】
五、HelloWorld
代碼:【package test.a_helloworld;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class HelloWorld {
/** #:獲取流程引擎 */
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/** 1:部署流程定義 */
@Test
public void deploymentProcessDefinition() {// 表【act_re_deployment】
Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()// 創(chuàng)建一個(gè)部署對(duì)象
.name("helloworld入門程序")// 添加部署的名稱
.addClasspathResource("diagrams/helloworld.bpmn")// 從classpath的資源中加載,一次只能加載一個(gè)文件
.addClasspathResource("diagrams/helloworld.png")// 從classpath的資源中加載,一次只能加載一個(gè)文件
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());// 1
System.out.println("部署名稱:" + deployment.getName());// helloworld入門程序
}
/** 2:啟動(dòng)流程實(shí)例 */
@Test
public void startProcessInstance() {// 表【act_hi_procinst/act_ru_execution】
// 流程定義的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()// 與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:" + pi.getId());// 流程實(shí)例ID 101
System.out.println("流程定義ID:" + pi.getProcessDefinitionId());// 流程定義ID
// helloworld:1:4
}
/** 3:查詢當(dāng)前人的個(gè)人任務(wù) */
@Test
public void findMyPersonalTask() {
String assignee = "張三";
Listlist = processEngine.getTaskService()// 與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()// 創(chuàng)建任務(wù)查詢對(duì)象
.taskAssignee(assignee)// 指定個(gè)人任務(wù)查詢,指定辦理人
.list();
if (list != null && list.size() > 0) {
for (Task task : list) {
System.out
.println("###############################################");
System.out.println("任務(wù)ID:" + task.getId());
System.out.println("任務(wù)名稱:" + task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:" + task.getCreateTime());
System.out.println("任務(wù)的辦理人:" + task.getAssignee());
System.out.println("流程實(shí)例ID:" + task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:" + task.getExecutionId());
System.out.println("流程定義ID:" + task.getProcessDefinitionId());
System.out
.println("###############################################");
}
}
}
/** 4:完成我的任務(wù) */
@Test
public void completeMyPersonalTask() {
// 任務(wù)ID
String taskId = "7502";
processEngine.getTaskService()// 與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:" + taskId);
}
}
】
六、ProcessDefinitionTest
代碼:【package test.b_processDefinition;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
public class ProcessDefinitionTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從classpath)*/
@Test
public void deploymentProcessDefinition_classpath(){
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("流程定義")//添加部署的名稱
.addClasspathResource("diagrams/helloworld.bpmn")//從classpath的資源中加載,一次只能加載一個(gè)文件
.addClasspathResource("diagrams/helloworld.png")//從classpath的資源中加載,一次只能加載一個(gè)文件
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**部署流程定義(從zip)*/
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("流程定義")//添加部署的名稱
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**查詢流程定義*/
@Test
public void findProcessDefinition(){
Listlist = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createProcessDefinitionQuery()//創(chuàng)建一個(gè)流程定義的查詢
/**指定查詢條件,where條件*/
// .deploymentId(deploymentId)//使用部署對(duì)象ID查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processDefinitionKey(processDefinitionKey)//使用流程定義的key查詢
// .processDefinitionNameLike(processDefinitionNameLike)//使用流程定義的名稱模糊查詢
/**排序*/
.orderByProcessDefinitionVersion().asc()//按照版本的升序排列
// .orderByProcessDefinitionName().desc()//按照流程定義的名稱降序排列
/**返回的結(jié)果集*/
.list();//返回一個(gè)集合列表,封裝流程定義
// .singleResult();//返回惟一結(jié)果集
// .count();//返回結(jié)果集數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
System.out.println("流程定義ID:"+pd.getId());//流程定義的key+版本+隨機(jī)生成數(shù)
System.out.println("流程定義的名稱:"+pd.getName());//對(duì)應(yīng)helloworld.bpmn文件中的name屬性值
System.out.println("流程定義的key:"+pd.getKey());//對(duì)應(yīng)helloworld.bpmn文件中的id屬性值
System.out.println("流程定義的版本:"+pd.getVersion());//當(dāng)流程定義的key值相同的相同下,版本升級(jí),默認(rèn)1
System.out.println("資源名稱bpmn文件:"+pd.getResourceName());
System.out.println("資源名稱png文件:"+pd.getDiagramResourceName());
System.out.println("部署對(duì)象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**刪除流程定義*/
@Test
public void deleteProcessDefinition(){
//使用部署ID,完成刪除
String deploymentId = "601";
/**
* 不帶級(jí)聯(lián)的刪除
* 只能刪除沒(méi)有啟動(dòng)的流程,如果流程啟動(dòng),就會(huì)拋出異常
*/
// processEngine.getRepositoryService()//
// .deleteDeployment(deploymentId);
/**
* 級(jí)聯(lián)刪除
* 不管流程是否啟動(dòng),都能可以刪除
*/
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
System.out.println("刪除成功!");
}
/**查看流程圖
* @throws IOException */
@Test
public void viewPic() throws IOException{
/**將生成圖片放到文件夾下*/
String deploymentId = "801";
//獲取圖片資源名稱
Listlist = processEngine.getRepositoryService()//
.getDeploymentResourceNames(deploymentId);
//定義圖片資源的名稱
String resourceName = "";
if(list!=null && list.size()>0){
for(String name:list){
if(name.indexOf(".png")>=0){
resourceName = name;
}
}
}
//獲取圖片的輸入流
InputStream in = processEngine.getRepositoryService()//
.getResourceAsStream(deploymentId, resourceName);
//將圖片生成到D盤(pán)的目錄下
File file = new File("D:/"+resourceName);
//將輸入流的圖片寫(xiě)到D盤(pán)下
FileUtils.copyInputStreamToFile(in, file);
}
/***附加功能:查詢最新版本的流程定義*/
@Test
public void findLastVersionProcessDefinition(){
Listlist = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.orderByProcessDefinitionVersion().asc()//使用流程定義的版本升序排列
.list();
/**
* Map
map集合的key:流程定義的key
map集合的value:流程定義的對(duì)象
map集合的特點(diǎn):當(dāng)map集合key值相同的情況下,后一次的值將替換前一次的值
*/
Mapmap = new LinkedHashMap();
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd);
}
}
ListpdList = new ArrayList(map.values());
if(pdList!=null && pdList.size()>0){
for(ProcessDefinition pd:pdList){
System.out.println("流程定義ID:"+pd.getId());//流程定義的key+版本+隨機(jī)生成數(shù)
System.out.println("流程定義的名稱:"+pd.getName());//對(duì)應(yīng)helloworld.bpmn文件中的name屬性值
System.out.println("流程定義的key:"+pd.getKey());//對(duì)應(yīng)helloworld.bpmn文件中的id屬性值
System.out.println("流程定義的版本:"+pd.getVersion());//當(dāng)流程定義的key值相同的相同下,版本升級(jí),默認(rèn)1
System.out.println("資源名稱bpmn文件:"+pd.getResourceName());
System.out.println("資源名稱png文件:"+pd.getDiagramResourceName());
System.out.println("部署對(duì)象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**附加功能:刪除流程定義(刪除key相同的所有不同版本的流程定義)*/
@Test
public void deleteProcessDefinitionByKey(){
//流程定義的key
String processDefinitionKey = "helloworld";
//先使用流程定義的key查詢流程定義,查詢出所有的版本
Listlist = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.processDefinitionKey(processDefinitionKey)//使用流程定義的key查詢
.list();
//遍歷,獲取每個(gè)流程定義的部署ID
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
//獲取部署ID
String deploymentId = pd.getDeploymentId();
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
}
}
}
}
】
七、ProcessInstance
代碼:【
package test.c_processInstance;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class ProcessInstanceTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從zip)*/
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("流程定義")//添加部署的名稱
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "王五";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
// .singleResult()//返回惟一結(jié)果集
// .count()//返回結(jié)果集的數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "1202";
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
/**查詢流程狀態(tài)(判斷流程正在執(zhí)行,還是結(jié)束)*/
@Test
public void isProcessEnd(){
String processInstanceId = "1001";
ProcessInstance pi = processEngine.getRuntimeService()//表示正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象
.createProcessInstanceQuery()//創(chuàng)建流程實(shí)例查詢
.processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
.singleResult();
if(pi==null){
System.out.println("流程已經(jīng)結(jié)束");
}
else{
System.out.println("流程沒(méi)有結(jié)束");
}
}
/**查詢歷史任務(wù)(后面講)*/
@Test
public void findHistoryTask(){
String taskAssignee = "張三";
Listlist = processEngine.getHistoryService()//與歷史數(shù)據(jù)(歷史表)相關(guān)的Service
.createHistoricTaskInstanceQuery()//創(chuàng)建歷史任務(wù)實(shí)例查詢
.taskAssignee(taskAssignee)//指定歷史任務(wù)的辦理人
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
/**查詢歷史流程實(shí)例(后面講)*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "1001";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與歷史數(shù)據(jù)(歷史表)相關(guān)的Service
.createHistoricProcessInstanceQuery()//創(chuàng)建歷史流程實(shí)例查詢
.processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
}
】
八、processVariables
代碼1:【
package test.d_processVariables;
import java.io.Serializable;
public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6757393795687480331L;
private Integer id;//編號(hào)
private String name;//姓名
private String education;
public String getEducation() {
return education;
}
public void setEducation(String education) {
this.education = education;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
】
代碼2:【
package test.d_processVariables;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
public class ProcessVariablesTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/** 部署流程定義(從InputStream) */
@Test
public void deploymentProcessDefinition_inputStream() {
InputStream inputStreambpmn = this.getClass().getResourceAsStream(
"/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream(
"/diagrams/processVariables.png");
Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()// 創(chuàng)建一個(gè)部署對(duì)象
.name("流程定義")// 添加部署的名稱
.addInputStream("processVariables.bpmn", inputStreambpmn)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署
.addInputStream("processVariables.png", inputStreampng)// 使用資源文件的名稱(要求:與資源文件的名稱要一致),和輸入流完成部署
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());//
System.out.println("部署名稱:" + deployment.getName());//
}
/** 啟動(dòng)流程實(shí)例 */
@Test
public void startProcessInstance() {
// 流程定義的key
String processDefinitionKey = "processVariables";
ProcessInstance pi = processEngine.getRuntimeService()// 與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:" + pi.getId());// 流程實(shí)例ID
System.out.println("流程定義ID:" + pi.getProcessDefinitionId());// 流程定義ID
}
/** 設(shè)置流程變量 */
@Test
public void setVariables() {
/** 與任務(wù)(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
// 任務(wù)ID
String taskId = "7502";
/** 一:設(shè)置流程變量,使用基本數(shù)據(jù)類型 */
// taskService.setVariableLocal(taskId, "請(qǐng)假天數(shù)", 5);//與任務(wù)ID綁定
// taskService.setVariable(taskId, "請(qǐng)假日期", new Date());
// taskService.setVariable(taskId, "請(qǐng)假原因", "回家探親,一起吃個(gè)飯");
/** 二:設(shè)置流程變量,使用javabean類型 */
/**
* 當(dāng)一個(gè)javabean(實(shí)現(xiàn)序列號(hào))放置到流程變量中,要求javabean的屬性不能再發(fā)生變化 * 如果發(fā)生變化,再獲取的時(shí)候,拋出異常
*
* 解決方案:在Person對(duì)象中添加: private static final long serialVersionUID =
* 6757393795687480331L; 同時(shí)實(shí)現(xiàn)Serializable
* */
Person p = new Person();
p.setId(20);
p.setName("翠花");
taskService.setVariable(taskId, "人員信息(添加固定版本)", p);
System.out.println("設(shè)置流程變量成功!");
}
/** 獲取流程變量 */
@Test
public void getVariables() {
/** 與任務(wù)(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
// 任務(wù)ID
String taskId = "5002";
/** 一:獲取流程變量,使用基本數(shù)據(jù)類型 */
// Integer days = (Integer) taskService.getVariable(taskId, "請(qǐng)假天數(shù)");
// Date date = (Date) taskService.getVariable(taskId, "請(qǐng)假日期");
// String resean = (String) taskService.getVariable(taskId, "請(qǐng)假原因");
// System.out.println("請(qǐng)假天數(shù):"+days);
// System.out.println("請(qǐng)假日期:"+date);
// System.out.println("請(qǐng)假原因:"+resean);
/** 二:獲取流程變量,使用javabean類型 */
Person p = (Person) taskService.getVariable(taskId, "人員信息(添加固定版本)");
System.out.println(p.getId() + " " + p.getName());
}
/** 模擬設(shè)置和獲取流程變量的場(chǎng)景 */
public void setAndGetVariables() {
/** 與流程實(shí)例,執(zhí)行對(duì)象(正在執(zhí)行) */
RuntimeService runtimeService = processEngine.getRuntimeService();
/** 與任務(wù)(正在執(zhí)行) */
TaskService taskService = processEngine.getTaskService();
/** 設(shè)置流程變量 */
// runtimeService.setVariable(executionId, variableName,
// value)//表示使用執(zhí)行對(duì)象ID,和流程變量的名稱,設(shè)置流程變量的值(一次只能設(shè)置一個(gè)值)
// runtimeService.setVariables(executionId,
// variables)//表示使用執(zhí)行對(duì)象ID,和Map集合設(shè)置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設(shè)置多個(gè)值)
// taskService.setVariable(taskId, variableName,
// value)//表示使用任務(wù)ID,和流程變量的名稱,設(shè)置流程變量的值(一次只能設(shè)置一個(gè)值)
// taskService.setVariables(taskId,
// variables)//表示使用任務(wù)ID,和Map集合設(shè)置流程變量,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值(一次設(shè)置多個(gè)值)
// runtimeService.startProcessInstanceByKey(processDefinitionKey,
// variables);//啟動(dòng)流程實(shí)例的同時(shí),可以設(shè)置流程變量,用Map集合
// taskService.complete(taskId, variables)//完成任務(wù)的同時(shí),設(shè)置流程變量,用Map集合
/** 獲取流程變量 */
// runtimeService.getVariable(executionId,
// variableName);//使用執(zhí)行對(duì)象ID和流程變量的名稱,獲取流程變量的值
// runtimeService.getVariables(executionId);//使用執(zhí)行對(duì)象ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值
// runtimeService.getVariables(executionId,
// variableNames);//使用執(zhí)行對(duì)象ID,獲取流程變量的值,通過(guò)設(shè)置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中
// taskService.getVariable(taskId,
// variableName);//使用任務(wù)ID和流程變量的名稱,獲取流程變量的值
// taskService.getVariables(taskId);//使用任務(wù)ID,獲取所有的流程變量,將流程變量放置到Map集合中,map集合的key就是流程變量的名稱,map集合的value就是流程變量的值
// taskService.getVariables(taskId,
// variableNames);//使用任務(wù)ID,獲取流程變量的值,通過(guò)設(shè)置流程變量的名稱存放到集合中,獲取指定流程變量名稱的流程變量的值,值存放到Map集合中
}
/** 完成我的任務(wù) */
@Test
public void completeMyPersonalTask() {
// 任務(wù)ID
String taskId = "2402";
processEngine.getTaskService()// 與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:" + taskId);
}
/** 查詢流程變量的歷史表 */
@Test
public void findHistoryProcessVariables() {
Listlist = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()// 創(chuàng)建一個(gè)歷史的流程變量查詢對(duì)象
.variableName("請(qǐng)假天數(shù)").list();
if (list != null && list.size() > 0) {
for (HistoricVariableInstance hvi : list) {
System.out.println(hvi.getId() + " "
+ hvi.getProcessInstanceId() + " "
+ hvi.getVariableName() + " "
+ hvi.getVariableTypeName() + " " + hvi.getValue());
System.out
.println("###############################################");
}
}
}
}
】
九、HistoryQuery
代碼:【
package test.e_historyQuery;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.junit.Test;
public class HistoryQueryTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**查詢歷史流程實(shí)例*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "2101";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與歷史數(shù)據(jù)(歷史表)相關(guān)的Service
.createHistoricProcessInstanceQuery()//創(chuàng)建歷史流程實(shí)例查詢
.processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
.orderByProcessInstanceStartTime().asc()
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
/**查詢歷史活動(dòng)*/
@Test
public void findHistoryActiviti(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//
.createHistoricActivityInstanceQuery()//創(chuàng)建歷史活動(dòng)實(shí)例的查詢
.processInstanceId(processInstanceId)//
.orderByHistoricActivityInstanceStartTime().asc()//
.list();
if(list!=null && list.size()>0){
for(HistoricActivityInstance hai:list){
System.out.println(hai.getId()+" "+hai.getProcessInstanceId()+" "+hai.getActivityType()+" "+hai.getStartTime()+" "+hai.getEndTime()+" "+hai.getDurationInMillis());
System.out.println("#####################");
}
}
}
/**查詢歷史任務(wù)*/
@Test
public void findHistoryTask(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//與歷史數(shù)據(jù)(歷史表)相關(guān)的Service
.createHistoricTaskInstanceQuery()//創(chuàng)建歷史任務(wù)實(shí)例查詢
.processInstanceId(processInstanceId)//
.orderByHistoricTaskInstanceStartTime().asc()
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
/**查詢歷史流程變量*/
@Test
public void findHistoryProcessVariables(){
String processInstanceId = "2101";
Listlist = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()//創(chuàng)建一個(gè)歷史的流程變量查詢對(duì)象
.processInstanceId(processInstanceId)//
.list();
if(list!=null && list.size()>0){
for(HistoricVariableInstance hvi:list){
System.out.println(hvi.getId()+" "+hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());
System.out.println("###############################################");
}
}
}
}
】
十、SequenceFlow
代碼:【
package test.f_sequenceFlow;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class SequenceFlowTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("連線")//添加部署的名稱
.addInputStream("sequenceFlow.bpmn", inputStreamBpmn)//
.addInputStream("sequenceFlow.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "sequenceFlow";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "趙六";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
// .singleResult()//返回惟一結(jié)果集
// .count()//返回結(jié)果集的數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "3103";
//完成任務(wù)的同時(shí),設(shè)置流程變量,使用流程變量用來(lái)指定完成任務(wù)后,下一個(gè)連線,對(duì)應(yīng)sequenceFlow.bpmn文件中${message=='不重要'}
Mapvariables = new HashMap();
variables.put("message", "重要");
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId,variables);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
}
】
十一、ExclusiveGateWay
代碼:【
package test.g_exclusiveGateWay;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class ExclusiveGateWayTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("exclusiveGateWay.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("exclusiveGateWay.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("排他網(wǎng)關(guān)")//添加部署的名稱
.addInputStream("exclusiveGateWay.bpmn", inputStreamBpmn)//
.addInputStream("exclusiveGateWay.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "exclusiveGateWay";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "王小五";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
// .singleResult()//返回惟一結(jié)果集
// .count()//返回結(jié)果集的數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "3904";
//完成任務(wù)的同時(shí),設(shè)置流程變量,使用流程變量用來(lái)指定完成任務(wù)后,下一個(gè)連線,對(duì)應(yīng)exclusiveGateWay.bpmn文件中${money>1000}
Mapvariables = new HashMap();
variables.put("money", 200);
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId,variables);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
}
】
十二、ParallelGateWay
代碼:【
package test.h_parallelGateWay;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class ParallelGateWayTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("parallelGateWay.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("parallelGateWay.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("并行網(wǎng)關(guān)")//添加部署的名稱
.addInputStream("parallelGateWay.bpmn", inputStreamBpmn)//
.addInputStream("parallelGateWay.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "parallelGateWay";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "商家";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
// .singleResult()//返回惟一結(jié)果集
// .count()//返回結(jié)果集的數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "4302";
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
}
】
十三、Start
代碼:【
package test.i_start;
import java.io.InputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
public class StartTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("start.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("start.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("開(kāi)始活動(dòng)")//添加部署的名稱
.addInputStream("start.bpmn", inputStreamBpmn)//
.addInputStream("start.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例+判斷流程是否結(jié)束+查詢歷史*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "start";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
/**判斷流程是否結(jié)束,查詢正在執(zhí)行的執(zhí)行對(duì)象表*/
ProcessInstance rpi = processEngine.getRuntimeService()//
.createProcessInstanceQuery()//創(chuàng)建流程實(shí)例查詢對(duì)象
.processInstanceId(pi.getId())
.singleResult();
//說(shuō)明流程實(shí)例結(jié)束了
if(rpi==null){
/**查詢歷史,獲取流程的相關(guān)信息*/
HistoricProcessInstance hpi = processEngine.getHistoryService()//
.createHistoricProcessInstanceQuery()//
.processInstanceId(pi.getId())//使用流程實(shí)例ID查詢
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
}
}
】
十四、ReceiveTask
代碼:【
import java.io.InputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
public class ReceiveTaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("receiveTask.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("receiveTask.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("接收活動(dòng)任務(wù)")//添加部署的名稱
.addInputStream("receiveTask.bpmn", inputStreamBpmn)//
.addInputStream("receiveTask.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例+設(shè)置流程變量+獲取流程變量+向后執(zhí)行一步*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "receiveTask";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
/**查詢執(zhí)行對(duì)象ID*/
Execution execution1 = processEngine.getRuntimeService()//
.createExecutionQuery()//創(chuàng)建執(zhí)行對(duì)象查詢
.processInstanceId(pi.getId())//使用流程實(shí)例ID查詢
.activityId("receivetask1")//當(dāng)前活動(dòng)的id,對(duì)應(yīng)receiveTask.bpmn文件中的活動(dòng)節(jié)點(diǎn)id的屬性值
.singleResult();
/**使用流程變量設(shè)置當(dāng)日銷售額,用來(lái)傳遞業(yè)務(wù)參數(shù)*/
processEngine.getRuntimeService()//
.setVariable(execution1.getId(), "匯總當(dāng)日銷售額", 21000);
/**向后執(zhí)行一步,如果流程處于等待狀態(tài),使得流程繼續(xù)執(zhí)行*/
processEngine.getRuntimeService()
.signal(execution1.getId());
/**查詢執(zhí)行對(duì)象ID*/
Execution execution2 = processEngine.getRuntimeService()//
.createExecutionQuery()//創(chuàng)建執(zhí)行對(duì)象查詢
.processInstanceId(pi.getId())//使用流程實(shí)例ID查詢
.activityId("receivetask2")//當(dāng)前活動(dòng)的id,對(duì)應(yīng)receiveTask.bpmn文件中的活動(dòng)節(jié)點(diǎn)id的屬性值
.singleResult();
/**從流程變量中獲取匯總當(dāng)日銷售額的值*/
Integer value = (Integer)processEngine.getRuntimeService()//
.getVariable(execution2.getId(), "匯總當(dāng)日銷售額");
System.out.println("給老板發(fā)送短信:金額是:"+value);
/**向后執(zhí)行一步,如果流程處于等待狀態(tài),使得流程繼續(xù)執(zhí)行*/
processEngine.getRuntimeService()
.signal(execution2.getId());
}
}
】
十五、Task
代碼:【
package test.k_personalTask;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("任務(wù)")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
/**啟動(dòng)流程實(shí)例的同時(shí),設(shè)置流程變量,使用流程變量用來(lái)指定任務(wù)的辦理人,對(duì)應(yīng)task.pbmn文件中#{userID}*/
Mapvariables = new HashMap();
variables.put("userID", "周芷若");
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "周芷若";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程實(shí)例ID查詢
// .executionId(executionId)//使用執(zhí)行對(duì)象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
// .singleResult()//返回惟一結(jié)果集
// .count()//返回結(jié)果集的數(shù)量
// .listPage(firstResult, maxResults);//分頁(yè)查詢
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "5505";
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
}
】
十六、group
代碼:【
package test.l_group;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class TaskTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程定義(從inputStream)*/
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("task.bpmn");
InputStream inputStreamPng = this.getClass().getResourceAsStream("task.png");
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對(duì)象相關(guān)的Service
.createDeployment()//創(chuàng)建一個(gè)部署對(duì)象
.name("任務(wù)")//添加部署的名稱
.addInputStream("task.bpmn", inputStreamBpmn)//
.addInputStream("task.png", inputStreamPng)//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名稱:"+deployment.getName());//
}
/**啟動(dòng)流程實(shí)例*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "task";
/**啟動(dòng)流程實(shí)例的同時(shí),設(shè)置流程變量,使用流程變量用來(lái)指定任務(wù)的辦理人,對(duì)應(yīng)task.pbmn文件中#{userIDs}*/
Mapvariables = new HashMap();
variables.put("userIDs", "大大,中中,小小");
ProcessInstance pi = processEngine.getRuntimeService()//與正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service
.startProcessInstanceByKey(processDefinitionKey,variables);//使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)helloworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照最新版本的流程定義啟動(dòng)
System.out.println("流程實(shí)例ID:"+pi.getId());//流程實(shí)例ID
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID
}
/**查詢當(dāng)前人的個(gè)人任務(wù)*/
@Test
public void findMyPersonalTask(){
String assignee = "小A";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個(gè)人任務(wù)查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**查詢當(dāng)前人的組任務(wù)*/
@Test
public void findMyGroupTask(){
String candidateUser = "大大";
Listlist = processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.createTaskQuery()//創(chuàng)建任務(wù)查詢對(duì)象
/**查詢條件(where部分)*/
.taskCandidateUser(candidateUser)//組任務(wù)的辦理人查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用創(chuàng)建時(shí)間的升序排列
/**返回結(jié)果集*/
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任務(wù)ID:"+task.getId());
System.out.println("任務(wù)名稱:"+task.getName());
System.out.println("任務(wù)的創(chuàng)建時(shí)間:"+task.getCreateTime());
System.out.println("任務(wù)的辦理人:"+task.getAssignee());
System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId());
System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId());
System.out.println("流程定義ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任務(wù)*/
@Test
public void completeMyPersonalTask(){
//任務(wù)ID
String taskId = "6905";
processEngine.getTaskService()//與正在執(zhí)行的任務(wù)管理相關(guān)的Service
.complete(taskId);
System.out.println("完成任務(wù):任務(wù)ID:"+taskId);
}
/**查詢正在執(zhí)行的任務(wù)辦理人表*/
@Test
public void findRunPersonTask(){
//任務(wù)ID
String taskId = "6204";
Listlist = processEngine.getTaskService()//
.getIdentityLinksForTask(taskId);
if(list!=null && list.size()>0){
for(IdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
/**查詢歷史任務(wù)的辦理人表*/
@Test
public void findHistoryPersonTask(){
//流程實(shí)例ID
String processInstanceId = "6201";
Listlist = processEngine.getHistoryService()//
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
if(list!=null && list.size()>0){
for(HistoricIdentityLink identityLink:list){
System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
}
}
}
/**拾取任務(wù),將組任務(wù)分給個(gè)人任務(wù),指定任務(wù)的辦理人字段*/
@Test
public void claim(){
//將組任務(wù)分配給個(gè)人任務(wù)
//任務(wù)ID
String taskId = "6905";
//分配的個(gè)人任務(wù)(可以是組任務(wù)中的成員,也可以是非組任務(wù)的成員)
String userId = "大大";
processEngine.getTaskService()//
.claim(taskId, userId);
}
/**將個(gè)人任務(wù)回退到組任務(wù),前提,之前一定是個(gè)組任務(wù)*/
@Test
public void setAssigee(){
//任務(wù)ID
String taskId = "6204";
processEngine.getTaskService()//
.setAssignee(taskId, null);
}
/**向組任務(wù)中添加成員*/
@Test
public void addGroupUser(){
//任務(wù)ID
String taskId = "6204";
//成員辦理人
String userId = "大H";
processEngine.getTaskService()//
.addCandidateUser(taskId, userId);
}
/**從組任務(wù)中刪除成員*/
@Test
public void deleteGroupUser(){
//任務(wù)ID
String taskId = "6204";
//成員辦理人
String userId = "小B";
processEngine.getTaskService()//
.deleteCandidateUser(taskId, userId);
}
}
】
工作流activiti eclipse 插件不自動(dòng)生成png
步驟:
window
——> preferences
——>activiti
——>save
——>選中create process definition image when saving the diagram