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

能夠在項目中加入log4j,將logj4.properties文件拷入到src目錄下,這樣框架執行的sql就能夠輸出到到控制檯,log4j提供的日誌級別有如下幾種:

Fatal  error  warn  info  debug  tracejava

1、部署流程定義mysql

1,在工程項目下建立源碼文件夾processsql

2,在該文件下下面新建立一個工做流流程定義文件test1.bpmn(NewàActivit Diagram)數據庫

3,在test1.bpmn文件定義請假流程或者是報銷流程apache

4,測試代碼編程

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. public class ActivitiAPI {  
  2.    //首先得到默認的流程引擎,在建立時會自動加載classpath下得activiti.cfg.xml或者是activiti-context.xml  
  3.    ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();  
  4.    /** 
  5.      * 1.部署流程定義 
  6.      * 會在三張表中產生數據: 
  7.       * act_ge_bytearray 產生兩條數據 
  8.      *act_re_deployment 產生一條數據 
  9.      *act_re_procdef 產生一條數據 
  10.     * 方式一:讀取單個的流程定義文件 
  11.     * 方式二:讀取zip壓縮文件 
  12.     */  
  13.    @Test  
  14.    public void deploy() {  
  15.       // 獲取倉庫服務並建立發佈配置對象  
  16.       DeploymentBuilder deploymentBuilder = processEngine  
  17.             .getRepositoryService().createDeployment();  
  18.       // 方式一:設置發佈信息  
  19.       deploymentBuilder.name("請假流程部署");//添加部署規則的名稱  
  20. // 讀取單個的流程定義文件  
  21.       deploymentBuilder.addClasspathResource("test1.bpmn");  
  22. // 添加規則圖片  不添加會自動產生一個圖片不推薦  
  23.       deploymentBuilder.addClasspathResource("test1.png");  
  24.       Deployment  
  25.       deployment =deploymentBuilder.deploy();  
  26.    
  27.       // 方式二:讀取zip壓縮文件  
  28.       /*ZipInputStream zipInputStream = new ZipInputStream(this.getClass() 
  29.    .getClassLoader().getResourceAsStream("process.zip")); 
  30.       deploymentBuilder.addZipInputStream(zipInputStream); 
  31.       Deployment deployment =deploymentBuilder.deploy();*/  
  32.    }  
  33.    }  

 

部署流程定義步驟:框架

  1)     首先得到默認的流程引擎getDefaultProcessEngine(),在建立時會自動加載classpath下得activiti-context.xml或者是activiti.cfg.xml工具

  2)     經過流程引擎獲取了一個RepositoryService對象也就是倉庫服務對象測試

  3)     由倉庫的服務對象建立一個部署對象配置對象,用來封裝部署環境的相關配置。ui

  4)     這是一個鏈式編程,在部署配置對象中設置顯示名,上傳規則文件相對classpath的地址。

  5)     部署,也是往數據庫中存儲流程定義的過程。

  6)     這一步在數據庫中將操做三張表:

    a)     act_re_deployment

       存放流程定義的顯示名和部署時間,每部署一次增長一條記錄

    b)     act_re_procdef

       存放流程定義的屬性信息,部署每一個新的流程定義都會在這張表中增長一條記錄。

    c)     act_ge_bytearray

       存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增長兩條記錄,一條是關於bpmn規則文件的,一條是圖片的(若是部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件不是很大,都是以二進制形式存儲在數據庫中。

2、查詢流程定義

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 查詢流程定義列表 
  3.     */  
  4.      
  5. @Test  
  6.    public void queryProcessDefinition(){  
  7.       // 流程定義查詢對象,用於查詢表act_re_procdef,添加條件查詢  
  8.       ProcessDefinitionQuery query = processEngine.getRepositoryService()  
  9.             .createProcessDefinitionQuery();  
  10.       // 添加過濾條件  
  11.       query.processDefinitionKey("bxlc");  
  12.       // 添加排序條件降序排序  
  13.       query.orderByProcessDefinitionVersion().desc();  
  14.       // 添加分頁查詢  
  15.       query.listPage(0, 10);  
  16.       List<ProcessDefinition> list =query.list();  
  17.       for(ProcessDefinition pd : list) {  
  18. System.out.println(pd.getName()+ "" + pd.getId());  
  19.       }  
  20.    }  


流程定義查詢步驟:

 

 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的值以必定的形式變化

3、刪除流程定義

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 刪除流程定義(經過刪除部署信息達到刪除流程定義的目的) 
  3. *刪除act_re_procdef和act_re_deployment表中的一條記錄 
  4.     */  
  5. @Test  
  6. public void delDeployment() throwsException {  
  7.  // 獲取倉庫服務對象  
  8.  RepositoryService repositoryService =processEngine.getRepositoryService();  
  9.  // 刪除發佈信息  
  10.  String deploymentId = "1";  
  11.  // 普通刪除,若是當前規則下有正在執行的流程,則拋異常  
  12.  repositoryService.deleteDeployment(deploymentId);  
  13.  // 級聯刪除,會刪除和當前規則相關的全部信息,包括歷史  
  14.  repositoryService.deleteDeployment(deploymentId, true);  
  15.  }  

4、啓動流程實例

 

什麼是流程實例?根據一個流程定義具體的一次執行過程就是一個流程實例,一個流程定義對應多個流程實例(一對多關係),好比:已經定義了一個請假流程,張三同窗走了一次該流程這就是啓動一次流程實例

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /**根據流程定義的id啓動一個流程實例,這個流程定義的Id來自act_re_procdef 
  2.     * 啓動一次流程實例act_ru_execution表增長一條數據 
  3.     */  
  4.    @Test  
  5.    public void startProcessInstance() {  
  6. //獲取流程定義ID  
  7.       /* 
  8.        *String processDefinitionId = "qjlc:9:1204"; ProcessInstance 
  9.        *processInstance = 
  10.        *processEngine.getRuntimeService().startProcessInstanceById 
  11.        * (processDefinitionId );System.out.println(processInstance.getId()); 
  12.        */  
  13. //自動選擇最新版本的流程定義啓動流程實例建議使用key來啓動  
  14.       String processDefinitionKey = "qjlc";  
  15.       ProcessInstance processInstance = processEngine.getRuntimeService()  
  16.             .startProcessInstanceByKey(processDefinitionKey);  
  17.       System.out.println(processInstance.getId());  
  18.    }  

5、查詢流程實例列表

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 查詢流程實例列表,查詢act_ru_execution表 
  3.     */  
  4.    @Test  
  5.    public void queryProcessInstance(){  
  6.       //流程實例查詢對象,查詢act_ru_execution表  
  7.       ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();  
  8.       query.processDefinitionKey("qjlc");  
  9.       query.orderByProcessInstanceId().desc();  
  10.       query.listPage(0, 2);  
  11.       List<ProcessInstance> list =query.list();  
  12.       for(ProcessInstance pi : list) {  
  13.          System.out.println(pi.getId()+ " " + pi.getActivityId());  
  14.       }  
  15.    }  

6、結束流程實例

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 結束流程實例,操做的表 
  3.     * 執行表:act_ru_execution(刪除一條數據) 
  4.     * 任務表 act_ru_task(刪除一條數據) 
  5.     */  
  6.    @Test  
  7.    public void deleteProcessInstance(){  
  8.       String processInstanceId = "1601";  
  9.       processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "我願意");  
  10.    }  

7、查詢部署信息

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 查詢部署列表(同一個流程定義由於修改會進行屢次的部署,版本號不同version會增長,每次部署act_re_deployment表增長一條記錄) 
  3.     */  
  4.    @Test  
  5.    public void queryDeployment() {  
  6.       // 部署查詢對象,查詢表act_re_deployment  
  7.       DeploymentQuery query = processEngine.getRepositoryService()  
  8.             .createDeploymentQuery();  
  9.       List<Deployment> list =query.list();  
  10.       for (Deploymentdeployment : list) {  
  11.          String id = deployment.getId();  
  12.          System.out.println(id);  
  13.       }  
  14.    }  

8、刪除部署信息

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 刪除部署信息,刪除act_re_procdef和act_re_deployment表中的一條記錄 
  3.     */  
  4.    @Test  
  5.    public void deleteDeployment() {  
  6.       String deploymentId = "101";  
  7.       // processEngine.getRepositoryService().deleteDeployment(deploymentId);  
  8.       //true表明刪除級聯關聯表信息  
  9.       processEngine.getRepositoryService().deleteDeployment(deploymentId,  
  10.             true);  
  11.    }  

9、查詢一次流程部署對應的文件名稱(bpmn,png)和輸入流

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 查詢一次部署對應的流程定義文件名稱和對應的輸入流(bpmn,png) 
  3.     * @throws Exception 
  4.     */  
  5.    @Test  
  6.    public void queryProcessFile() throws Exception {  
  7.       String deploymentId = "101";  
  8.       List<String> names = processEngine.getRepositoryService()  
  9.             .getDeploymentResourceNames(deploymentId);  
  10.       for (String name :names) {  
  11.          System.out.println(name);  
  12.          InputStream in = processEngine.getRepositoryService()  
  13.                 .getResourceAsStream(deploymentId,name);  
  14.          // 將文件保存到本地磁盤  
  15.          /* 
  16.           * OutputStream out = new FileOutputStream(newFile("d:\\" + name)); 
  17.           * byte[] b = new byte[1024]; int len= 0; while((len = 
  18.           * in.read(b))!=-1) { out.write(b, 0, len);} out.close(); 
  19.           */  
  20. //使用org.apache.commons.io.FileUtils的工具類  
  21.          FileUtils.copyInputStreamToFile(in,new File("d:\\" + name));  
  22.          in.close();  
  23.       }  
  24.    }  

10、獲取流程定義圖標(png文件)

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 得到png文件的輸入流 
  3.     * 
  4.     * @throws Exception 
  5.     */  
  6.    @Test  
  7.    public void getPng() throws Exception {  
  8.       String processDefinitionId = "qjlc:9:1204";  
  9.       InputStream pngInputStream = processEngine.getRepositoryService()  
  10.             .getProcessDiagram(processDefinitionId);  
  11.       FileUtils.copyInputStreamToFile(pngInputStream,new File("d:\\my.png"));  
  12.    }  

11、      查詢我的任務列表

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 查詢任務列表查詢act_ru_task表 
  3.   
  4.     */  
  5.    @Test  
  6.    public void queryTask() {  
  7. TaskQuery query= processEngine.getTaskService().createTaskQuery();  
  8.       String assignee = "張三";  
  9.       query.taskAssignee(assignee);  
  10. query.orderByTaskCreateTime().desc();  
  11.       List<Task> list = query.list();  
  12.       for (Task task :list) {  
  13.          System.out.println(task.getId()+ " " + task.getName());  
  14.       }  
  15.    }  

12、      辦理任務

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
  1. /** 
  2.     * 辦理任務 
  3.     */  
  4.    @Test  
  5.    public void completeTask(){  
  6.       String taskId= "404";  
  7.       processEngine.getTaskService().complete(taskId);  
  8.    }  

十3、      直接將流程想下執行一步管理員用戶擁有該權限

 

 

[java]  view plain  copy
 
 
 
  在CODE上查看代碼片派生到個人代碼片
    1. /** 
    2.     * 直接將流程向下執行一步act_ru_task表增長一條數據,直接跳過一步 
    3.     */  
    4.    @Test  
    5.    public void signal(){  
    6.       String executionId = "2701";//流程實例id  
    7.       processEngine.getRuntimeService().signal(executionId);  
    8.    }  
相關文章
相關標籤/搜索