1. 程式人生 > >工作流框架Activiti常用功能初探

工作流框架Activiti常用功能初探

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
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.repository.DeploymentBuilder;
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.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

/**
 * 使用Activiti框架的API操作流程
 * 
 * @author PuHaiyang
 * @createTime 2016年6月28日 下午4:50:39
 * @email 
[email protected]
* @function Activiti基本功能測試 * */ public class MyActivitiAPITest { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); @Test public void deployActiviti() { // 如果之前沒有建立activiti相關的表,呼叫它會自動建立,由activiti-context.xml檔案內容建立 DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); deploymentBuilder.addClasspathResource("MyTest.bpmn"); deploymentBuilder.addClasspathResource("MyTest.png"); deploymentBuilder.name("i_am_name"); Deployment deploy = deploymentBuilder.deploy(); System.out.println(deploy.getId()); // 部署資訊表 insert into ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_, // DEPLOY_TIME_) values(?, ?, ?, ?) // 二進位制資料表,bpmn檔案插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, // BYTES_, DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?) // 二進位制資料表,png檔案插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, BYTES_, // DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?) // 流程定義資料表 insert into ACT_RE_PROCDEF(ID_, REV_, CATEGORY_, NAME_, KEY_, // VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_, // DESCRIPTION_, HAS_START_FORM_KEY_, SUSPENSION_STATE_) values (?, 1, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) } /** * 查詢部署列表 */ @Test public void queryDeployment() { DeploymentQuery deploymentQuery = processEngine.getRepositoryService().createDeploymentQuery(); List<Deployment> list = deploymentQuery.list(); for (Deployment deployment : list) { String id = deployment.getId(); System.out.println(id); } } /** * 刪除部署資訊 */ @Test public void deleteDeployment() { String deploymentId = "1"; // 第二個引數代表級聯操作 processEngine.getRepositoryService().deleteDeployment(deploymentId, true); // 刪除所有相關的activiti資訊 } /** * 查詢一次部署對應的流程定義檔名稱和對應的輸入流(bpmn png) * * @throws Exception */ @Test public void queryDeploymentResource() throws Exception { String deploymentId = "101"; List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId); for (String name : names) { System.out.println(name); InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name); // 將檔案儲存到本地磁碟 // FileUtils來自commons-io-xxx.jar FileUtils.copyInputStreamToFile(in, new File("d:\\" + name)); in.close(); } } /** * 獲得流程表中流程圖 * * @throws Exception */ @Test public void getProcessDiagream() throws Exception { String processDefinitionId = "myProcess:1:104"; InputStream pngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId); FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png")); } /** * 啟動流程例項 <br> * 方式一:根據流程定義的id啟動 <br> * 方式二:根據流程定義的key啟動(自動選擇最新版本的流程定義啟動流程例項) */ @Test public void startProcess() { /* * 方式一:根據流程定義的id啟動 String processDefinitionId = "myProcess:1:104"; * ProcessInstance processInstance = * processEngine.getRuntimeService().startProcessInstanceById * (processDefinitionId ); System.out.println(processInstance.getId()); */ // 方式二:根據流程定義的key啟動(自動選擇最新版本的流程定義啟動流程例項) String processDefinitionKey = "myProcess"; ProcessInstance processInstance = processEngine.getRuntimeService() .startProcessInstanceByKey(processDefinitionKey); System.out.println(processInstance.getId()); // 呼叫SQL語句如下 // 1 ACT_RU_EXECUTION 執行時流程執行例項表 // insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, // BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, // IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, // SUSPENSION_STATE_, CACHED_ENT_STATE_) values ( ?, 1, ?, ?, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ? ) // 2 ACT_HI_PROCINST 歷史流程例項表 // insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_, // PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_, // START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_, // DELETE_REASON_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 3 ACT_HI_ACTINST 歷史節點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 4 ACT_HI_ACTINST 歷史節點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 5 ACT_RU_TASK 執行時任務節點表 // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 6 ACT_HI_TASKINST 歷史任務例項表 // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ ) // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 7 ACT_RU_IDENTITYLINK 執行時流程人員表,主要儲存任務節點與參與者的相關資訊 // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, // ?, ?, ?, ?) // 8 ACT_HI_IDENTITYLINK 歷史流程人員表 // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?) } /** * 查詢流程例項列表,查詢act_ru_execution表 */ @Test public void queryRuntimeProcess() { // 流程例項查詢物件,查詢act_ru_execution表 ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery(); query.processDefinitionKey("myProcess"); query.orderByProcessInstanceId().desc(); query.listPage(0, 2); List<ProcessInstance> list = query.list(); for (ProcessInstance pi : list) { System.out.println(pi.getId() + " " + pi.getActivityId()); } } /** * 不通過<br> * 刪除流程例項 */ @Test public void deleteProcess() { String processInstanceId = "201"; processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "不準逃課!"); // 執行刪除部分SQL如下 // 1 ACT_RU_TASK 執行時任務節點表 // delete from ACT_RU_TASK where ID_ = ? and REV_ = ? // 2 ACT_RU_IDENTITYLINK 執行時流程人員表,主要儲存任務節點與參與者的相關資訊 // delete from ACT_RU_IDENTITYLINK where ID_ = ? // 3 ACT_RU_EXECUTION 執行時流程執行例項表 // delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ? // 執行更新部分SQL如下 // 1 ACT_HI_PROCINST 歷史流程例項表 // update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?, // END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ? // where ID_ = ? // 2 ACT_HI_ACTINST 歷史節點表 // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ // = ?, DURATION_ = ? where ID_ = ? // 3 ACT_HI_TASKINST 歷史任務例項表 // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where // ID_ = ? } /** * 查詢任務 */ @Test public void queryTask() { // 任務查詢物件,查詢act_ru_task表 TaskQuery query = processEngine.getTaskService().createTaskQuery(); String assignee = "班主任"; query.taskAssignee(assignee); query.orderByTaskCreateTime().desc(); List<Task> list = query.list(); for (Task task : list) { System.out.println(task.getId()); } // 執行sql如下 // 1 ACT_GE_PROPERTY 屬性資料表儲存整個流程引擎級別的資料,初始化表結構時,會預設插入三條記錄, // select * from ACT_GE_PROPERTY where NAME_ = ? // 2 ACT_RU_TASK 執行時任務節點表 // select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ? // order by RES.CREATE_TIME_ desc LIMIT ? OFFSET ? } /** * 處理任務 */ @Test public void completeTask() { String taskId = "304"; processEngine.getTaskService().complete(taskId); // 執行的主要SQL如下 // 1 ACT_GE_PROPERTY 屬性資料表儲存整個流程引擎級別的資料,初始化表結構時,會預設插入三條記錄 // update ACT_GE_PROPERTY SET REV_ = ?, VALUE_ = ? where NAME_ = ? and // REV_ = ? // 2 ACT_HI_ACTINST 歷史節點表 // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 3 ACT_RU_TASK 執行時任務節點表 // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?, // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 4 ACT_HI_TASKINST 歷史任務例項表 // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ ) // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) // 5 ACT_RU_IDENTITYLINK 執行時流程人員表,主要儲存任務節點與參與者的相關資訊 // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?, // ?, ?, ?, ?) // 6 ACT_HI_IDENTITYLINK 歷史流程人員表 // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_, // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?) // 7 ACT_HI_TASKINST 歷史任務例項表 // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?, // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?, // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?, // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where // ID_ = ? // 8 ACT_RU_EXECUTION 執行時流程執行例項表 // update ACT_RU_EXECUTION set REV_ = ?, PROC_DEF_ID_ = ?, ACT_ID_ = ?, // IS_ACTIVE_ = ?, IS_CONCURRENT_ = ?, IS_SCOPE_ = ?, IS_EVENT_SCOPE_ = // ?, PARENT_ID_ = ?, SUPER_EXEC_ = ?, SUSPENSION_STATE_ = ?, // CACHED_ENT_STATE_ = ? where ID_ = ? and REV_ = ? // 9 ACT_HI_ACTINST 歷史節點表 // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_ // = ?, DURATION_ = ? where ID_ = ? // 10 ACT_RU_TASK 執行時任務節點表 // delete from ACT_RU_TASK where ID_ = ? and REV_ = ? } /** * 直接將流程向下執行一步 */ @Test public void signal() { String executionId = "301";// 流程例項id processEngine.getRuntimeService().signal(executionId); } /** * 查詢最新版本的流程定義列表 */ @Test public void getLastTasks() { ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery(); query.orderByProcessDefinitionVersion().asc(); List<ProcessDefinition> list = query.list(); Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : list) { map.put(pd.getKey(), pd); } ArrayList<ProcessDefinition> lastList = new ArrayList<>(map.values()); for (ProcessDefinition processDefinition : lastList) { System.out.println(processDefinition.getName() + " " + processDefinition.getVersion()); } } }


相關推薦

工作框架Activiti常用功能初探

import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import

Activiti工作框架學習(二)——使用Activiti提供的API完成流程操作

可以在專案中加入log4j,將logj4.properties檔案拷入到src目錄下,這樣框架執行的sql就可以輸出到到控制檯,log4j提供的日誌級別有以下幾種: Fatal  error  warn  info  debug  trace 一、部署流程定義 1,在工程專

Activiti工作框架學習七:流程定義圖以及流程例項執行狀態圖

在實際生產中,我們除了需要檢視流程定義資訊的列表外,還需要檢視相應的流程定義圖,以及每個流程例項的執行狀態圖 流程定義圖 流程例項執行狀態圖,實際上流程例項執行狀態圖就是在流程定義圖的基礎上,查到該流程例項執行的當前任務節點,並根據此任務節點查出

Activiti工作框架學習(一)之通用資料表詳細介紹

文/朱季謙 Activiti工作流引擎自帶了一套資料庫表,這裡面有一個需要注意的地方: 低於5.6.4的MySQL版本不支援時間戳或毫秒級的日期。更糟糕的是,某些版本在嘗試建立此類列時將引發異常,而其他版本則不會。執行自動建立/升級時,引擎將在執行DDL時更改它。使用DDL檔案方法時,既可以使用常規版本也可以

工作學習——Activiti流程變量五步曲

eight 作用域 bound ets oca ole ati pat nds 一、前言 上一篇文章我們將流程實例的啟動與查詢,任務的辦理查詢都進行了介紹,我們這篇文章來介紹activiti中的流程變量。 二、正文 流程變量與我們平常理解的變量是

工作學習——Activiti整體認識二步曲

表示 www avi clip service() 軟件 date ldp rom 一、前言 在上一篇文章中我們將工作流的相關概念、activiti的前世今生、activiti與jbpm的比較進行學習,這篇文章我們正式進行activiti的學習,activiti

Activity工作框架

fontsize work 兩個 database data- 流程設計 size 開源 參數 Activity工作流入門 1. 工作流概念 工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之

工作3-activiti工作流程定義的CURD

activiti的流程定義API Explain:activiti對流程的增刪該查 (學習源自傳智播客itcast) 獲取引擎 ProcessEngine processEngine = ProcessEngine.getDefaultProcessEngine();

工作引擎Activiti使用自我總結

轉載自:工作流引擎Activiti使用總結 1.簡單介工作流引擎與Activiti 對於工作流引擎的解釋請參考百度百科:工作流引擎 1.1 我與工作流引擎 在第一家公司工作的時候主要任務就是開發OA系統,當然基本都是有工作流的支援,不過當時使用的工作流引擎是公司一些牛人開發的(據

帶你瞭解什麼是Activiti工作Activiti工作資料庫表詳細介紹(23張表)

帶你五分鐘瞭解工作流 什麼是工作流 說到工作流,一圖勝萬言。 工作流 Georgakopoulos給出的工作流定義是:工作流是將一組任務組織起來以完成某個經營過程:定義了任務的觸發順序和觸發條件,每個任務可以由一個或多個軟體系統完成,也可以由一個或一組人完成,還可以由一個或多個

asp.net強大後臺:learun混合工作框架規範

工作流 以前,我們對標準工作流進行過簡單梳理,今天,我們再來看一下混合工作流。 了解混合工作流,我們必須要先分清角色、內容、流程之間的關系——即角色與內容是掛在流程節點上的功能點。在實際操作中,我們需要將流程節點控制好,再將不同的角色,以及對應的操作內容掛靠上去即可,這樣一來是可

activiti5 工作的回退功能

        activiti5 工作流 本身不提供回退,按網路的說法,外國人的回退也是要在流程圖設計裡面畫出來的,可惜在中國各種各樣的需求,肯定是需要實現的。在實現回退的功能上看了網路上面的方法,都是直接修改分支表的節點ID或者通過設定節點的下節點來實現回退和跳躍等需求

說說如何在專案中引入 jBPM4 工作框架以及遇到的坑兒

由於各種原因,我們需要在專案中引入 jBPM4 工作流框架,遇到了不少問題,今記錄如下O(∩_∩)O 1 引入步驟 1.1 加入依賴包 非 Maven 專案,在 lib 包中加入 jbpm.jar。 Maven 專案,加入以下配置: &

初識工作 BPMN Activiti以及JBPM

  最近做OA系統,接觸了工作流,知道了JBPM和Activiti兩種工作流引擎。 工作流    BPMN   BPMN全稱Business Process Model And Notation(

AWS Flow Framework工作框架_工作管理

AWS Flow Framework 是一組方便易用的庫的集合,有了這些庫,您可以更加輕鬆快速地使用 Amazon Simple Workflow 構建應用程式。使用 AWS Flow Framework,您可以編寫簡單的程式碼,讓框架中預先構建的物件和類來處理 Amazon

Activity 工作框架學習總結

環境的搭建和資料表的瞭解 1. 什麼是工作流? 工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文件、資訊或任務的過程自動進行,從而實現某個預期的業務目標,或者

工作學習——Activiti流程例項、任務管理四步曲

轉載:https://blog.csdn.net/zwk626542417/article/details/46646565一、前言    上一篇文章中我們將Activiti流程定義管理的知識進行了介紹,這篇文章我們繼續Activiti流程例項和任務管理的學習。二、正文流程例

工作引擎activiti

一。activiti簡介      Activiti專案是一項新的基於Apache許可的開源BPM平臺,從基礎開始構建,旨在提供支援新的BPMN 2.0標準,包括支援物件管理組(OMG),面對新技術的機遇,諸如互操作性和雲架構,提供技術實現。       創始人Tom Bae

Activiti工作開發——Activiti相關概念

Activiti對流程的描述是基於資料庫表的,Activiti有23張表,分別用來儲存工作流各個階段的資料,各個表的資料欄位和作用請參考blog Activiti資料表結構說明 Activiti工作流的核心是一個叫ProcessEngine的介面,這個介面控制著整個工作流

工作引擎Activiti系列(一)——初識

1、介紹     幾乎任何一個公司的軟體開發都會涉及到流程,以往我們可能是這麼實現的:業務表新增標誌位標識流程的節點狀態,關聯批註表實現稽核意見,根據一些業務資料分析處理邏輯,分配任務到使用者,節點的排程,審批等.....這其實是很繁瑣的,且不說開發起來比較混亂,維護起來更