流程簡介:
爲實現某個業務目標,在多個參與者之間,利用程序,按某種預定規則自動傳遞信息。
相關概念:
BPM
BPM(Business Process Management)(業務流程管理),流程的概念和標準。
從本質上說,BPM並不是一個IT術語,更不是因技術的發展而起源的,相反,BPM至始至終都是管理學術語和概念。BPM的核心是通過對企業運營的業務流程的梳理、改造、監控、優化來獲得利益的最大化。要達到這一目的,必須把企業資源和管理方法從縱向的戰略到業務的執行打通,使得企業業務流程當中每一個活動都能夠明確的指向特定的戰略目標並且可以測量和評估,從而獲得改進的方向;同時必須把企業資源和管理方法從橫向的各部門、職能甚至第三方職能整合爲一個有機的整體,使得企業業務流程可以以端到端的方式,即從業務目標的提出(業務流程建立)到業務執行結果(業務活動的測量),來管理企業的運營以獲得最大的利益。
而BPM軟件產品則是針對這種管理方式的一種構造工具——一種令人異常興奮的工具,可提供更快更好更便宜的解決方案。
BPMN
BPMN是BPM及workflow的建模語言標準之一。
BPMN的主要目標就是要提供被所有業務用戶理解的一套標記語言。
BPMN定義了業務流程圖,其基於流程圖技術,同時爲創建業務流程操作的圖形化模型進行了裁減。業務流程的模型就是圖形化對象的網圖,包括活動(也可以說工作)和定義操作順序的流控制。
常用流程框架:
Activiti
Activiti項目是一項新的基於Apache許可的開源BPM平臺,從基礎開始構建,旨在提供支持新的BPMN 2.0標準,包括支持對象管理組(OMG),面對新技術的機遇,諸如互操作性和雲架構,提供技術實現。
JBPM
jBPM是根據Apache軟件許可證發佈的開源軟件。它使用100%純Java™編寫,可在任何JVM上運行。
jBPM的核心是一個輕量級,可擴展的工作流引擎,用純Java編寫,允許您使用最新的BPMN 2.0規範執行業務流程。它可以在任何Java環境中運行,嵌入在您的應用程序中或作爲服務運行。
Activiti的使用
eclipse插件安裝
Activiti Designer - http://activiti.org/designer/update/
新建activiti項目和流程圖
設置節點條件
${manager}爲流程變量
依賴
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
創建流程引擎需要的表
通過代碼方式創建
public static void main(String[] args) {
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("root");
//false create-drop true
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//工作流的核心對象,ProcessEngine對象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
}
通過配置文件方式創建
配置文件activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 流程引擎配置 -->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
public static void main(String[] args) {
ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//工作流的核心對象,ProcessEngine對象
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
}
關鍵對象
//流程引擎
static ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
static RepositoryService repositoryService = processEngine.getRepositoryService();//管理流程定義
static RuntimeService runtimeService = processEngine.getRuntimeService(); //執行管理,包括啓動、推進、刪除流程實例
static TaskService taskService = processEngine.getTaskService();//任務管理
static HistoryService historyService = processEngine.getHistoryService();//歷史管理
static IdentityService identityService = processEngine.getIdentityService();//組織機構管理
static FormService formService = processEngine.getFormService();//一個可選服務,任務表單
部署流程定義
/**
* 部署流程定義
* 用到的表:
* act_re_deployment
*/
public static void deploymentProcessDefinition(){
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的service
.createDeployment() //創建一個部署對象
.name("leave") //添加部署的名稱
.addClasspathResource("diagrams/leave.bpmn") //加載流程圖
.addClasspathResource("diagrams/leave.png")
.deploy();//完成部署
System.out.println("部署id:"+deployment.getId());
System.out.println("部署名稱:"+deployment.getName());
}
/**
* 部署流程定義
* 用到的表:
* act_re_deployment
*/
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/leave.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//與流程定義和部署對象相關的service
.createDeployment() //創建一個部署對象
.name("leave") //添加部署的名稱
.addZipInputStream(zipInputStream)
.deploy();//完成部署
System.out.println("部署id:"+deployment.getId());
System.out.println("部署名稱:"+deployment.getName());
}
啓動流程實例
/**
* 啓動流程實例
* 用到的表:
* act_re_procdef
* act_ru_execution
*/
public static void startProcessInstance(){
String key = "leave";
ProcessInstance pi = runtimeService.startProcessInstanceByKey(key);//使用流程定義的key啓動流程實例,key對應.bpmn文件中的id
System.out.println("流程實例id:"+pi.getId());
System.out.println("流程定義:"+pi.getProcessDefinitionId());
/*Task firstTask = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//獲取第一個任務節點
taskService.setAssignee(firstTask.getId(), "自定義用戶");//設置下一步處理人
System.out.println(firstTask);*/
}
設置下一步處理人
/**
* 設置處理人
*/
public static void setHandler(){
String taskId = ""; // 任務id
String userId = ""; // 處理人
taskService.setAssignee(taskId, userId);
}
查詢當前的個人任務
/**
* 查詢當前的個人任務
* 用到的表:
* act_ru_task
*/
public static void findMyPersonalTask(){
String assignee = "王五"; // 處理人
List<Task> taskList = taskService.createTaskQuery().taskAssignee(assignee)
//.taskCandidateUser("")
//.processDefinitionId("")
//.executionId("")
.list();
for (Task task : taskList) {
System.out.println("任務id:"+task.getId());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務的創建時間:"+task.getCreateTime());
System.out.println("任務的辦理人:"+task.getAssignee());
System.out.println("流程實例id:"+task.getProcessInstanceId());
System.out.println("執行對象id:"+task.getExecutionId());
System.out.println("流程定義id:"+task.getProcessDefinitionId());
System.out.println("------------------------------");
}
}
完成任務
/**
* 完成任務
*/
public static void completeMyPersonalTask(){
// 任務id
String taskId = "62504";
// 流程變量
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("manager", true);
taskService.complete(taskId,variables);
System.out.println("完成任務!");
}
設置和獲取流程變量
//模擬設置和獲取流程變量的場景
public static void setAndGetVariables(){
String executionId = ""; // 流程實例id
String variableName = ""; // 變量名
String value = ""; // 變量值
String taskId = ""; // 任務id
// 變量map集合
Map<String, String> map = new HashMap<String,String>();
// 設置流程實例變量方式1
runtimeService.setVariable(executionId, variableName, value);
// 設置流程實例變量方式2
runtimeService.setVariables(executionId, map);
// 設置任務變量方式1
taskService.setVariable(taskId, variableName, value);
// 設置任務變量方式2
taskService.setVariables(taskId, map);
// 獲取流程實例指定變量
runtimeService.getVariable(executionId, variableName);
// 獲取流程實例所有變量
runtimeService.getVariables(executionId);
// 獲取任務指定變量
taskService.getVariable(taskId, variableName);
// 獲取任務所有變量
taskService.getVariables(taskId);
}
Activiti表介紹
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據。用於不同場景下,如存放資源文件。
資源庫流程規則表
1) act_re_deployment 部署信息表
2) act_re_model 流程設計模型部署表
3) act_re_procdef 流程定義數據表
運行時數據庫表
1) act_ru_execution 運行時流程執行實例表
2) act_ru_identitylink 運行時流程人員表,主要存儲任務節點與參與者的相關信息
3) act_ru_task 運行時任務節點表
4) act_ru_variable 運行時流程變量數據表
歷史數據庫表
1) act_hi_actinst 歷史節點表
2) act_hi_attachment 歷史附件表
3) act_hi_comment 歷史意見表
4) act_hi_identitylink 歷史流程人員表
5) act_hi_detail 歷史詳情表,提供歷史變量的查詢
6) act_hi_procinst 歷史流程實例表
7) act_hi_taskinst 歷史任務實例表
8) act_hi_varinst 歷史變量表
組織機構表
1) act_id_group 用戶組信息表
2) act_id_info 用戶擴展信息表
3) act_id_membership 用戶與用戶組對應信息表
4) act_id_user 用戶信息表
這四張表很常見,基本的組織機構管理,關於用戶認證方面建議還是自己開發一套,組件自帶的功能太簡單,使用中有很多需求難以滿足
通用數據表
1) act_ge_bytearray 二進制數據表
2) act_ge_property 屬性數據表存儲整個流程引擎級別的數據,初始化表結構時,會默認插入三條記錄