Activiti Explorer簡介
- Activiti Explorer: Activiti控制台,是一個web應用程序
- 從Activiti的官方網站下載Activiti的壓縮zip文件時,Activiti控制台在 ${Activiti_home}/wars文件夾下面
- 該控制台的目的並不是創建一個完善的web應用程序,僅僅是為客戶端用戶准備的應用程序.對於該控制台,使用了一個內存數據庫,也可以換成自定義的數據庫(查看WEB-INF文件夾下面的applicationContext.xml文件)
- 登錄控制台,有四個主要功能模塊:
- Tasks: 任務管理功能
- 如果是任務執行人,可以看見運行中流程實例的待辦任務,也可以拾取組任務
- 控制台涉及的功能有子任務的工作,不同角色的人...
- 控制台允許創建一個獨立的任務,該任務不需要關聯任何流程實例
- Processes: 顯示部署的流程定義列表,並且可以啟動一個新的流程實例
- Reports: 生成報表和顯示之前保存歷史的結果數據
- Manage: 用於管理Activiti的流程引擎
- 管理用戶和組
- 執行和查看停止的jobs
- 查看數據庫和部署新的流程定義
- 登錄的用戶具有超級管理員權限才會顯示
- Tasks: 任務管理功能
流程圖
- 控制台包含的功能,使用RaphaëlJavascript框架自動生成一張流程圖:
- 當流程定義XML包含的BPMN注入信息時,該流程圖才能夠生成
- 當流程定義XML中並沒有BPMN注入信息,但是部署的時候包含一張流程圖,那么該圖片也將會被顯示
- 如果不想使用Javascript生成流程圖,可以在ui.properties文件禁用
activiti.ui.jsdiagram = false
- 控制台上顯示流程圖,也可以對流程圖進行查看,根據流程定義的ID,顯示流程定義圖片:
http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36
- 通過processInstanceId的請求參數,可以顯示當前流程實例的狀態:
http://localhost:8080/activiti-explorer/diagram-viewer/index.html?processDefinitionId=reviewSaledLead:1:36&processInstanceId=41
Tasks
- 任務
- Inbox: 顯示登錄用戶需要辦理的所有任務列表
- My Tasks: 顯示登錄用戶任務擁有者的任務列表:
- 當創建一個獨立的任務時,可以自動化操作該任務
- Queued: 顯示不用的組任務列表,並且登錄用戶在該組中:
- 這里的所有任務都必須先拾取,然后才能夠完成
- Involved: 顯示登錄用戶被參與的任務,即不是執行人和任務擁有者
- Archived: 歸檔,包含已經完成歷史任務
Processes
Deployed process definitions(部署流程定義)
- 在流程定義選項卡中,允許查看Activiti流程引擎部署的所有流程定義
- 可以使用頁面頂部右邊的按鈕啟動一個新的流程實例
- 如果該流程定義有一個啟動表單, 那么在啟動流程實例之前就會先顯示表單
My instances(我的流程實例)
- 顯示當前登錄用戶未完成的用戶任務的所有流程實例
- 直觀地顯示流程實例的當前活動和存儲的流程變量
Manage
- 在管理功能中,只有當登錄用戶是權限組admin中的成員時,該功能才會顯示
- 當點擊Manage圖標按鈕:
Database
- Database: 數據庫.顯示Activiti有關內容.當開發流程或者排除故障等問題的時候是非常有用的
Deployments
- Deployments: 部署.顯示當前部署的流程引擎,並且可以看到部署的內容:流程定義,流程圖,業務規則,等等...
- 當點擊部署按鈕時,可以上傳新的部署:
- 從自己的計算機中選擇一個業務文檔或者一個BPMN20.XML文件
- 簡單的拖拽到指定的區域就可以部署一個新的業務流程
Jobs
- Jobs: 作業
- 在左邊顯示當前的作業(定時器等等)並且運行手動執行(例如在截止時間之前觸發定時器)
- 如果作業執行失敗(例如郵件服務器不能正常工作),那么就會顯示所有的異常
Users
- Users: 管理用戶
- 創建,修改和刪除用戶.關聯用戶
- 獲取權限查看任務分配特定用戶信息
Groups
- Groups: 管理組
- 創建,修改和刪除組,關聯組
- 獲取權限查看任務分配特定組等信息
Reports
- 報表:
- 注意: 如果要讓報表工作,控制台需要配置歷史的級別不能為none.默認的配置是滿足要求的
- 報表選項卡的子選項卡有2個:
- 生成報表:
- 顯示系統中已知的報表列表
- 允許運行生成的報表
- 保存報表:
- 顯示之前保存的所有報表列表
- 僅僅顯示的是個人保存的報表,並且不能看見其他人保存的報表
- 生成報表:
- 流程的數據被用於生成報表中的列表和圖標.使用流程生成報表數據的優勢:
- 該流程能夠直接訪問Activiti流程引擎的內部:
- 直接可以使用流程引擎訪問數據庫
- 作業執行器能夠用於任何其他的流程:
- 能夠異步生成流程
- 僅僅異步執行某些步驟
- 可以使用定時器:在某些時間點上面生成報表數據
- 可以用已知的工具和已知的概念創建一個新的報表:
- 沒有新的概念,服務或者應用被需要
- 部署或者上傳一個新的報表與部署一個新的流程是一樣的
- 可以使用BPMN2.0結構:
- 意味着所有的東西:比如並行網關,可以實現基於數據或用戶請求輸入生成分支
- 該流程能夠直接訪問Activiti流程引擎的內部:
- 生成報表數據的流程定義需要把activiti-report設置為分類,這樣就能在Explorer的報表列表中顯示出來。
- 能夠看到報表的唯一要求是:
- 流程創建一個名為reportData的流程變量,這個變量必須是json對象的二進制數組
- 變量必須保存到Activiti的歷史表中,所以要求引擎必須啟用歷史功能
- 因此可以在后面報表保存時獲取
reportData
- 報表流程必須生成一個變量reportData, 作為展示給用戶的JSON數據:
{
"title": "My Report",
"datasets": [
{
"type" : "lineChart",
"description" : "My first chart",
"xaxis" : "Year"
"yaxis" : "Total sales"
"data" :
{
"2010" : 50,
"2011" : 33,
"2012" : 17,
"2013" : 87,
}
}
]
}
json數據會在Explorer中獲取,並用來生成圖表或列表
- json的元素有:
- title: 報表的標題
- datasets: 數據集的數組,對應報表中不同的圖表和列表
- type: 數據集的類型. 這個類型會用來決定如何渲染數據,支持的值:
- pieChart
- lineChart
- barChart
- list
- description: 每個圖表在報表中顯示一個描述,這個是可選的
- xaxis: 只對lineChart類型起作用,這個參數是可選的,用來修改圖表坐標系x軸的名稱
- yaxis: 只對lineChart類型起作用,這個參數是可選的,用來修改圖表坐標系y軸的名稱
- data: 實際的數據,數據是一個key:value格式的json對象
流程實例
- 流程實例總覽報表:
- 只包含一個腳本任務:使用javascript生成json數據集
- 雖然所有Explorer中的例子都使用javascript, 也可以使用java服務任務
- 執行流程最后的結果就是reportData變量,保存數據
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="activiti-report">
<process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true">
<startEvent id="startevent1" name="Start" />
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" />
<scriptTask id="generateDataset" name="Execute script" scriptFormat="JavaScript" activiti:autoStoreVariables="false">
<script><![CDATA[
importPackage(java.sql);
importPackage(java.lang);
importPackage(org.activiti.explorer.reporting);
var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_");
var reportData = {};
reportData.datasets = [];
var dataset = {};
dataset.type = "pieChart";
dataset.description = "Process instance overview (" + new java.util.Date() + ")";
dataset.data = {};
while (result.next()) { // process results one row at a time
var name = result.getString(1);
var version = result.getLong(2)
var count = result.getLong(3);
dataset.data[name + " (v" + version + ")"] = count;
}
reportData.datasets.push(dataset);
execution.setVariable("reportData", new java.lang.String(JSON.stringify(reportData)).getBytes("UTF-8"));
]]></script>
</scriptTask>
<sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
- 除了流程xml頂部的標准xml,主要區別是targetNamespace設置為activiti-report, 把分類設置為與部署的流程定義一樣的名稱
- 腳本的第一行是進行一些導入,避免每次使用時,都要寫包名
- 第一個有意義的代碼是使用ReportingUtil讀取activiti數據庫.返回結果是一個JDBC 結果集
- 查詢語句下面 ,javascript創建了使用的json.json是符合上面描述的需求的
- 最后一行腳本,首先需要把json對象轉換成字符串,使用javascript函數JSON.stringify(). 字符串需要保存為二進制數組類型的變量
- 這是一個技術問題:
- 二進制數組的大小是無限的,但是字符串的長度有限制
- 這就是為什么javascript字符串必須轉換成一個java字符串以獲得轉換成二進制的功能
- 這是一個技術問題:
- 原生json功能無法使用,這里提供了一些幫助類ReportData和Dataset:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="activiti-report">
<process id="process-instance-overview-report" name="Process Instance Overview" isExecutable="true">
<startEvent id="startevent1" name="Start" />
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="generateDataset" />
<scriptTask id="generateDataset" name="Execute script" scriptFormat="js" activiti:autoStoreVariables="false">
<script><![CDATA[
importPackage(java.sql);
importPackage(java.lang);
importPackage(org.activiti.explorer.reporting);
var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_");
var reportData = new ReportData;
var dataset = reportData.newDataset();
dataset.type = "pieChart";
dataset.description = "Process instance overview (" + new java.util.Date() + ")"
while (result.next()) { // process results one row at a time
var name = result.getString(1);
var version = result.getLong(2);
var count = result.getLong(3);
dataset.add(name + " (v" + version + ")", count);
}
execution.setVariable("reportData", reportData.toBytes());
]]></script>
</scriptTask>
<sequenceFlow id="flow3" sourceRef="generateDataset" targetRef="theEnd" />
<endEvent id="theEnd" />
</process>
</definitions>
報告開始表單
- 報表是使用普通流程來生成的,所以表單功能也可以使用
- 直接在開始事件里加一個開始表單 ,Explorer就會在生成報表之前展示給用戶
<startEvent id="startevent1" name="Start">
<extensionElements>
<activiti:formProperty id="processDefinition" name="Select process definition" type="processDefinition" required="true" />
<activiti:formProperty id="chartType" name="Chart type" type="enum" required="true">
<activiti:value id="pieChart" name="Pie chart" />
<activiti:value id="barChart" name="Bar chart" />
</activiti:formProperty>
</extensionElements>
</startEvent>
- 為用戶渲染一個普通的表單:
- 表單屬性會在啟動流程時提交,然后就可以像普通的流程變量一樣使用.腳本中可以使用這些流程變量來生成數據:
var processDefinition = execution.getVariable("processDefinition");
流程示例
- 控制台中包含4個報表示例:
- Employee productivity(員工的工作效率):
- 報表演示使用折線圖和開始表單
- 報表的腳本比其他例子要復雜,因為數據會在腳本中先進行解釋,再保存到報表數據中
- Helpdesk(一線與升級):
- 使用餅圖進行展示
- 結合兩個不同的數據庫查詢結果
- Process instance overview(流程實例總覽):
- 使用多個數據集的報表實例
- 報表包含使用相同數據的餅圖和列表視圖
- 展示多種數據集可以用來在一個頁面中生成不同圖表
- Task duration(任務持續時間):
- 另一個使用開始表單的例子
- 會使用對應的變量來動態生成SQL查詢語句
- Employee productivity(員工的工作效率):
修改數據庫
- 要修改控制台例子所用的數據庫:
- 改變屬性文件:apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/classes/db.properties
- 在類路徑下放上合適的數據庫驅動:
- Tomcat共享類庫
- 在apps/apache-tomcat-6.x/webapps/activiti-explorer/WEB-INF/lib/ 中