可以在項目中加入log4j,將logj4.properties文件拷入到src目錄下,這樣框架執行的sql就可以輸出到到控制檯,log4j提供的日誌級別有以下幾種:
Fatal error warn info debug trace
一、部署流程定義
1,在工程項目下創建源碼文件夾process
2,在該文件下下面新創建一個工作流流程定義文件test1.bpmn(NewàActivit Diagram)
3,在test1.bpmn文件定義請假流程或者是報銷流程
4,測試代碼
public class ActivitiAPI {
//首先獲得默認的流程引擎,在創建時會自動加載classpath下得activiti.cfg.xml或者是activiti-context.xml
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
/**
* 1.部署流程定義
* 會在三張表中產生數據:
* act_ge_bytearray 產生兩條數據
*act_re_deployment 產生一條數據
*act_re_procdef 產生一條數據
* 方式一:讀取單個的流程定義文件
* 方式二:讀取zip壓縮文件
*/
@Test
public void deploy() {
// 獲取倉庫服務並創建發佈配置對象
DeploymentBuilder deploymentBuilder = processEngine
.getRepositoryService().createDeployment();
// 方式一:設置發佈信息
deploymentBuilder.name("請假流程部署");//添加部署規則的名稱
// 讀取單個的流程定義文件
deploymentBuilder.addClasspathResource("test1.bpmn");
// 添加規則圖片 不添加會自動產生一個圖片不推薦
deploymentBuilder.addClasspathResource("test1.png");
Deployment
deployment =deploymentBuilder.deploy();
// 方式二:讀取zip壓縮文件
/*ZipInputStream zipInputStream = new ZipInputStream(this.getClass()
.getClassLoader().getResourceAsStream("process.zip"));
deploymentBuilder.addZipInputStream(zipInputStream);
Deployment deployment =deploymentBuilder.deploy();*/
}
}
部署流程定義步驟:
1) 首先獲得默認的流程引擎getDefaultProcessEngine(),在創建時會自動加載classpath下得activiti-context.xml或者是activiti.cfg.xml
2) 通過流程引擎獲取了一個RepositoryService對象也就是倉庫服務對象
3) 由倉庫的服務對象創建一個部署對象配置對象,用來封裝部署環境的相關配置。
4) 這是一個鏈式編程,在部署配置對象中設置顯示名,上傳規則文件相對classpath的地址。
5) 部署,也是往數據庫中存儲流程定義的過程。
6) 這一步在數據庫中將操作三張表:
a) act_re_deployment
存放流程定義的顯示名和部署時間,每部署一次增加一條記錄
b) act_re_procdef
存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。
c) act_ge_bytearray
存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關於bpmn規則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件不是很大,都是以二進制形式存儲在數據庫中。
二、查詢流程定義
/**
* 查詢流程定義列表
*/
@Test
public void queryProcessDefinition(){
// 流程定義查詢對象,用於查詢表act_re_procdef,添加條件查詢
ProcessDefinitionQuery query = processEngine.getRepositoryService()
.createProcessDefinitionQuery();
// 添加過濾條件
query.processDefinitionKey("bxlc");
// 添加排序條件降序排序
query.orderByProcessDefinitionVersion().desc();
// 添加分頁查詢
query.listPage(0, 10);
List<ProcessDefinition> list =query.list();
for(ProcessDefinition pd : list) {
System.out.println(pd.getName()+ "" + pd.getId());
}
}
流程定義查詢步驟:
1) 因爲流程定義的信息存放在倉庫中,所以應該獲取RepositoryService。
2) 創建流程定義查詢對象,可以在ProcessDefinitionQuery上設置查詢過濾參數
3) 調用ProcessDefinitionQuery對象的list方法,執行查詢,獲得符合條件的流程定義列表
4) 由運行結果可以看出:
a) Key和Name的值爲:bpmn文件process節點的id和name的屬性值
b) key屬性被用來區別不同的流程定義。
c) 帶有特定key的流程定義第一次部署時,version爲1。之後每次部署都會在當前最高版本號上加1
d) Id的值的生成規則爲:{processDefinitionKey}:{processDefinitionVersion}:{generated-id},這裏的generated-id是一個自動生成的唯一的數字
e) 重複部署一次,deploymentId的值以一定的形式變化
三、刪除流程定義
/**
* 刪除流程定義(通過刪除部署信息達到刪除流程定義的目的)
*刪除act_re_procdef和act_re_deployment表中的一條記錄
*/
@Test
public void delDeployment() throwsException {
// 獲取倉庫服務對象
RepositoryService repositoryService =processEngine.getRepositoryService();
// 刪除發佈信息
String deploymentId = "1";
// 普通刪除,如果當前規則下有正在執行的流程,則拋異常
repositoryService.deleteDeployment(deploymentId);
// 級聯刪除,會刪除和當前規則相關的所有信息,包括歷史
repositoryService.deleteDeployment(deploymentId, true);
}
四、啓動流程實例
什麼是流程實例?根據一個流程定義具體的一次執行過程就是一個流程實例,一個流程定義對應多個流程實例(一對多關係),比如:已經定義了一個請假流程,張三同學走了一次該流程這就是啓動一次流程實例
/**根據流程定義的id啓動一個流程實例,這個流程定義的Id來自act_re_procdef
* 啓動一次流程實例act_ru_execution表增加一條數據
*/
@Test
public void startProcessInstance() {
//獲取流程定義ID
/*
*String processDefinitionId = "qjlc:9:1204"; ProcessInstance
*processInstance =
*processEngine.getRuntimeService().startProcessInstanceById
* (processDefinitionId );System.out.println(processInstance.getId());
*/
//自動選擇最新版本的流程定義啓動流程實例建議使用key來啓動
String processDefinitionKey = "qjlc";
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId());
}
五、查詢流程實例列表
/**
* 查詢流程實例列表,查詢act_ru_execution表
*/
@Test
public void queryProcessInstance(){
//流程實例查詢對象,查詢act_ru_execution表
ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
query.processDefinitionKey("qjlc");
query.orderByProcessInstanceId().desc();
query.listPage(0, 2);
List<ProcessInstance> list =query.list();
for(ProcessInstance pi : list) {
System.out.println(pi.getId()+ " " + pi.getActivityId());
}
}
六、結束流程實例
/**
* 結束流程實例,操作的表
* 執行表:act_ru_execution(刪除一條數據)
* 任務表 act_ru_task(刪除一條數據)
*/
@Test
public void deleteProcessInstance(){
String processInstanceId = "1601";
processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "我願意");
}
七、查詢部署信息
/**
* 查詢部署列表(同一個流程定義因爲修改會進行多次的部署,版本號不一樣version會增加,每次部署act_re_deployment表增加一條記錄)
*/
@Test
public void queryDeployment() {
// 部署查詢對象,查詢表act_re_deployment
DeploymentQuery query = processEngine.getRepositoryService()
.createDeploymentQuery();
List<Deployment> list =query.list();
for (Deploymentdeployment : list) {
String id = deployment.getId();
System.out.println(id);
}
}
八、刪除部署信息
/**
* 刪除部署信息,刪除act_re_procdef和act_re_deployment表中的一條記錄
*/
@Test
public void deleteDeployment() {
String deploymentId = "101";
// processEngine.getRepositoryService().deleteDeployment(deploymentId);
//true代表刪除級聯關聯表信息
processEngine.getRepositoryService().deleteDeployment(deploymentId,
true);
}
九、查詢一次流程部署對應的文件名稱(bpmn,png)和輸入流
/**
* 查詢一次部署對應的流程定義文件名稱和對應的輸入流(bpmn,png)
* @throws Exception
*/
@Test
public void queryProcessFile() 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);
// 將文件保存到本地磁盤
/*
* OutputStream out = new FileOutputStream(newFile("d:\\" + name));
* byte[] b = new byte[1024]; int len= 0; while((len =
* in.read(b))!=-1) { out.write(b, 0, len);} out.close();
*/
//使用org.apache.commons.io.FileUtils的工具類
FileUtils.copyInputStreamToFile(in,new File("d:\\" + name));
in.close();
}
}
十、獲取流程定義圖標(png文件)
/**
* 獲得png文件的輸入流
*
* @throws Exception
*/
@Test
public void getPng() throws Exception {
String processDefinitionId = "qjlc:9:1204";
InputStream pngInputStream = processEngine.getRepositoryService()
.getProcessDiagram(processDefinitionId);
FileUtils.copyInputStreamToFile(pngInputStream,new File("d:\\my.png"));
}
十一、 查詢個人任務列表
/**
* 查詢任務列表查詢act_ru_task表
*/
@Test
public void queryTask() {
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()+ " " + task.getName());
}
}
十二、 辦理任務
/**
* 辦理任務
*/
@Test
public void completeTask(){
String taskId= "404";
processEngine.getTaskService().complete(taskId);
}
十三、 直接將流程想下執行一步管理員用戶擁有該權限
/**
* 直接將流程向下執行一步act_ru_task表增加一條數據,直接跳過一步
*/
@Test
public void signal(){
String executionId = "2701";//流程實例id
processEngine.getRuntimeService().signal(executionId);
}