Activity-(五)HelloWorld實現

HelloWorld

做一個最簡單的HellWorld流程用代碼的方式實現並且走完流程。

以下是涉及到的比較重要的八張表

SELECT * FROM act_re_deployment;   -- 一 流程部署表
 
SELECT * FROM act_ge_bytearray;    -- 二 流程二進制表
 
SELECT * FROM act_re_procdef;      -- 三 流程定義表
 
SELECT * FROM act_ru_execution;    -- 四 流程正在運行表
 
SELECT * FROM act_hi_procinst;     -- 五 流程實例歷史表
 
SELECT * FROM act_ru_task;         -- 六 流程當前任務表
 
SELECT * FROM act_hi_taskinst;     -- 七 流程歷史任務表
 
SELECT * FROM act_hi_actinst;      -- 八 流程歷史活動節點表

相關步驟如下:

1.首先是需要部署流程定義。

2.啓動流程實例。

3.查看流程任務以及完成流程任務。

先決工作,成員變量定義

  1. 獲取流程實例引擎ProcessEngines;

  2. 獲取RepositoryService;

  3. 獲取RuntimeService;

  4. 獲取TaskService;

  5. 獲取HistoryService

     /**
      * 獲取默認的流程引擎實例 會自動讀取activiti.cfg.xml文件 
      */
     private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
     
     
     //定義一個成員變量
     RepositoryService repositoryService;
     
     RuntimeService runtimeService;
     
     TaskService taskService;
     
     HistoryService historyService;
     
     /**
      * 獲取流程引擎
      */
     @Before
     public void setUp() throws Exception {
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
         repositoryService = processEngine.getRepositoryService();
         runtimeService = processEngine.getRuntimeService();
         taskService = processEngine.getTaskService();
         historyService = processEngine.getHistoryService();
         
     }
    

部署流程定義圖:

	/**
	 * 部署流程定義
	 */
	@Test
	public void deploy(){
	    // 獲取部署對象
	    Deployment deployment=processEngine.getRepositoryService() // 部署Service
	                 .createDeployment()  // 創建部署
	                 .addClasspathResource("diagrams/MyProcess.bpmn")  // 加載資源文件
//	                 .addClasspathResource("diagrams/helloWorld.png")   // 加載資源文件
//	                 .name("HelloWorld流程")  // 流程名稱
	                 .deploy(); // 部署
	    System.out.println("流程部署ID:"+deployment.getId());
	    System.out.println("流程部署Name:"+deployment.getName());
	}

執行結果:

流程部署ID:17501
流程部署Name:null

接着啓動流程實例,這樣一個流程纔開始:

	/**
     * 啓動流程
     */
    @Test
    public void startProcess() {
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");
        String processInstanceId = processInstance.getId();
        String activityId = processInstance.getActivityId();
        String definitionId = processInstance.getProcessDefinitionId();
        
        System.out.println("流程實例ID:"+processInstanceId);
        System.out.println("正在活動的節點ID:"+activityId);
        System.out.println("流程定義ID:"+definitionId);
    }

執行結果:

流程實例ID:20001
正在活動的節點ID:usertask1
流程定義ID:myProcess:2:17504

查詢正在運行的實例:

	/**
     * 查詢正在運行的實例
     */
    @Test
    public void queryExecution(){
        List<Execution> executionList = runtimeService.createExecutionQuery()  //創建正在執行的流程查詢對象
                      .processDefinitionKey("myProcess")   //根據流程定義的key查詢
                      .orderByProcessInstanceId()  //根據流程實例id排序
                      .desc()  //倒序
                      .list();  //查詢出集合
        for(Execution execution: executionList){
            System.out.println("正在執行的流程對象的id: "+execution.getId());
            System.out.println("所屬流程實例的id:"+execution.getProcessInstanceId());
            System.out.println("正在活動的節點的id: "+execution.getActivityId());
            System.out.println("任務名稱: "+execution.getName());
        }
    }

執行結果:

正在執行的流程對象的id: 20001
所屬流程實例的id:20001
正在活動的節點的id: usertask1
任務名稱: null

查看一下白夜行這個用戶的任務信息:

	/**
     * 根據辦理人查詢任務
     */
    @Test
    public void queryTaskByAssignee(){
        String assignee = "白夜行";    // assignee 要與流程圖上的 Assignee 相同纔會被查詢到,否則就不返回該任務對象
        // 查詢並且返回任務即可
        List<Task> taskList = taskService.createTaskQuery()  // 任務相關Service // 創建任務查詢
                                     .processDefinitionKey("myProcess")
                                     .taskAssignee(assignee)// 指定某個人
                                     .orderByTaskCreateTime()
                                     .desc()
                                     .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());
        }
    }

執行結果:

任務ID:20004
任務名稱:myprocess
任務創建時間:Thu Mar 12 10:02:57 CST 2020
任務委派人:白夜行
流程實例ID:20001

查詢當前流程實例狀態

	/**
     * 查詢當前流程實例狀態
     */
    @Test
    public void queryProInstanceStateByProInstanceId(){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12501").singleResult();
        if(processInstance == null){
            System.out.println("當前流程已經完成");
        }else{
            System.out.println("當前流程實例ID:"+processInstance.getId());
            System.out.println("當前流程所處的位置:"+processInstance.getActivityId());
        }
    }	

執行結果:

當前流程實例ID:20001
當前流程所處的位置:usertask1

最後完成HelloWorld節點任務,把流程走完:

	/**
	 * 完成任務
	 */
	@Test
	public void completeTask(){

		TaskQuery query = taskService.createTaskQuery();			//創建任務查詢對象
		List<Task> list = query.processDefinitionKey("myProcess")	//指定流程定義
							   .taskAssignee("白夜行")				//指定委託人
							   .list();								//執行查詢
		for (Task task : list) {
			System.out.println(task);
			//taskService某些框架下需要使用@Autowired註解裝配
			taskService.complete(task.getId());						//完成任務,使任務進入下一步
		}
	}

查詢流程實例歷史

	/**
	 * 查詢流程實例歷史
	 */
	@Test
	public void queryHistory(){
		
		//1.創建流程實例的歷史查詢對象,historyService使用@Autowired註解注入
		HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
		HistoricProcessInstance instance = 
				query
					.processInstanceId("12501")	//流程實例的id
					.finished()					//調用這個方法後未完成的流程實例會返回null
					.singleResult();
		System.out.println(instance);
	}

這裏引出一個概念,流程定義和流程實例的關係,可以把這兩種關係理解成是類和對象的關係。 

流程定義是一個模板,而流程實例就是通過模板演變出來的具體的可用的東西。

首先當運行:deploy()部署流程定義方法,在數據庫中流程定義表會發生一些變化新增了一條數據,

act_re_deployment流程定義部署表:

然後act_re_prodef流程定義表也會有一條數據插入:

以及在act_ge_bytearray表中用來存儲資源信息:

接着來運行start()啓動流程實例:

act_ru_task運行時流程任務表新增了一條數據:

act_ru_execution 運行時流程執行表:

act_ru_identitulink是用於執行主體相關信息表:

可以查看剛剛"白夜行”這個用戶的任務:

運行findTask()查看用戶任務,控制檯輸出如下:

任務ID:20004
任務名稱:myprocess
任務創建時間:Thu Mar 12 10:02:57 CST 2020
任務委派人:白夜行
流程實例ID:20001

completeTask()方法完成任務:

然後數據庫中ru開頭的運行時候所有表的數據都沒了,因爲現在流程結束,不需要這些數據了。

在hi開頭的表裏,會新增不少數據,這些數據主要是用來歸檔查詢用的,也就是歷史數據。

act_hi_taskinst 歷史流程實例任務表加了一條任務數據;

act_hi_procinst 歷史流程實例實例表加了一條流程實例相關信息的數據(包括開始時間,結束時間等等信息);

act_hi_identitylink 歷史流程實例參數者的表加了一條數據;

act_hi_actinst 歷史活動節點表加了三條流程活動節點信息的數據(每個流程實例具體的執行活動節點的信息);
轉載自 :Activity-(五)HelloWorld實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章