1. 程式人生 > 其它 >Flowable 工作流基礎使用

Flowable 工作流基礎使用

學習來源

https://www.bilibili.com/video/BV1Pb4y1p7Ku?p=1

很重要的東西

一. 關於 Flowable 的介紹就不寫了,自己去看上面的視訊

二. 首先腦海中必須有一幅圖

這裡是整工作流引擎的使用視窗工具。

1.PeocessEngine

這個類是 flowable 工作流的執行引擎,後續所有的子工具使用都是從這個類出發構建的。

2.RepositoryService

可以想象成所有的執行流程圖都是存放在這個類的倉庫裡的。
只有一張圖在那裡工作流是肯定不能開始扭轉的,你必須把這張圖從倉庫中拿出來,告知給引擎,也就是部署。
這張圖是在Repository 這個倉庫裡的 那麼 Repository 也有能力讓這張圖消失,也就是刪除。

3.RuntimeService

這個類顧名思義,執行時服務,負責將部署進引擎的圖跑起來,並且填充這張圖裡基本引數,也就時流程變數,圖一定是憑藉類似於 if else 這種分支跳轉執行的

4.TaskService

圖運轉起來了,每個節點都是對應的處理人,對於人來將這就是個任務,那麼就可以通過TaskService 來拉取任務,執行任務,完成任務。

5.HistoryService

任務執行完了,理所當然的可以得到執行任務的歷史資訊,這些資訊可以用來做資料分析等諸如此類的事情

三.對於資料庫

個人認為,flowable 的資料庫表是非常多的,雖然有一定的規律,但是如果是初次入門,可以先放一放,但是對於被部署的圖必須是十分清楚的
就比如說視訊中當教材的這張圖

https://tkjohn.github.io/flowable-userguide/
這個網址去找對應的圖的 xml 檔案

實操正文

先搭建環境 ,建議先搭建 maven 環境 ,先不要搭建 spring 環境 ,先熟悉基本操作 ,並且不要糾結使用到的 API 基本見名知意,而且是鏈式程式設計,按照常理的邏輯想就可以了。
`

    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-engine</artifactId>
        <version>6.3.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>

`
建立 xml 檔案 (就是那個流程圖檔案)
在xml的第一個 userTask 中指定 負責人

建立日誌檔案(這個可有可無)

一. 獲取流程引擎

`
// 全域性引擎
private ProcessEngine processEngine;

@Before
public void testProcessEngine() {
    // 引擎全域性配置物件 ,這裡配置了資料庫
    ProcessEngineConfiguration configuration = new StandaloneInMemProcessEngineConfiguration();
    // 資料庫
    configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
    configuration.setJdbcUsername("root");
    configuration.setJdbcPassword("100544");
    configuration.setJdbcUrl("jdbc:mysql://42.192.121.155:3306/flowable?serverTimezone=UTC&nullCatelogMeansCurrent=true");
    // 建立表 預設的 35 張                 引數是建立的表策略
    configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    // 獲取流程引擎
    processEngine = configuration.buildProcessEngine();
}

`
獲取到流程引擎後 ,去開啟你的資料庫 ,你會驚喜的發現出現了 34 張表 ,而且大有規律

二. 部署流程例項

`

// 部署流程例項
@Test
public void processDeployment() {
                                  // 注意到這裡 ,是引擎獲取的 RepositoryService 物件幹活的 
    RepositoryService repository = processEngine.getRepositoryService();
                        //  這裡部署也是  RepositoryService 物件部署的
    Deployment deploy = repository.createDeployment()
            .addClasspathResource("holiday-request.bpmn20.xml")
            .name("請求流程").deploy();
    String id = deploy.getId();
    System.out.println(" id  =  " + id);
    String name = deploy.getName();
    System.out.println(" name = " + name);

}

`
部署完成後去檢視你的 act_re_deployment act_re_procdef act_ge_bytearray 表

三. 查詢流程例項

`

// 查詢流程例項
@Test
public void processDeploymentQuery() {
                                  //  這裡也是 RepositoryService物件幹活
    RepositoryService repository = processEngine.getRepositoryService();
    ProcessDefinitionQuery processDefinitionQuery = repository.createProcessDefinitionQuery();
                                                                           // 這裡注意 ,如果確定就一個 可以返回 singleResult 否則就返回  list ,不然會報錯
    ProcessDefinition result = processDefinitionQuery.deploymentId("2501").singleResult();
    String deploymentId = result.getDeploymentId();
    String name = result.getName();
    String description = result.getDescription();
    System.out.println(deploymentId);
    System.out.println(name);
    System.out.println(description);
}

`

四.刪除部署的流程

`

// 刪除部署的流程
@Test
public void processDeploymentDelete() {
    RepositoryService repository = processEngine.getRepositoryService();
    // 根據流程id 刪除流程 ,可以設定級聯刪除,這個方法後面有個引數  true  就是級聯刪除 ,相關的任務一定會被刪除掉
    repository.deleteDeployment("7501", true);
}

`

五.啟動流程例項

`

// 啟動流程例項
@Test
public void processDeploymentStart() {
    // 執行時服務                    注意看 此時的 物件已經變了 ,是 RuntimeService 
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 構建流程變數
    Map<String, Object> variables = new HashMap<>();
    variables.put("employee", "張三");
    variables.put("nroOfHolidays", 3);
    variables.put("descrition", "老子累了");
    // 根據主鍵啟動流程例項
    ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("holidayRequest", variables);
    String processDefinitionId = holidayRequest.getProcessDefinitionId();
    System.out.println(processDefinitionId);
    String activityId = holidayRequest.getActivityId();
    System.out.println(activityId);
}

`
啟動流程例項

引擎已經走到這裡了

啟動例項涉及到的表結構

六. 查詢任務

`

@Test
public void queryTask() {
    // 此時例項已經啟動了,啟動就是一個任務,那麼相應的呼叫的也就是任務的服務  
    //                    注意看這裡   TaskService
    TaskService service = processEngine.getTaskService();
    List<Task> list = service.createTaskQuery()
            .processDefinitionKey("holidayRequest")
            .taskAssignee("zhangsan")
            .list();

    System.out.println(list.size());
    for (Task task : list) {
        System.out.println("任務連結串列");
        System.out.println(task.getAssignee());
        System.out.println(task.getDescription());
        System.out.println(task.getId());
        System.out.println(task.getName());
    }
}

`

七.完成任務

`

@Test
public void completeTask() {
// TaskService
TaskService service = processEngine.getTaskService();
List task = service.createTaskQuery()
.processDefinitionKey("holidayRequest")
.taskAssignee("zhangsan")
.list();
// 流程變數 ,就那個閘道器裡需要的值
HashMap<String, Object> map = new HashMap<>();
map.put("approved", false);
task.forEach((t) -> {
service.complete(t.getId(), map);
});
}

`

流程圖跳轉

完成任務就跑到這裡來了

注意 : 流程圖中的完成任務 本例中走的是不同意 ,咱們需要實現不同意方向的實現類

程式碼示例

`

// 注意實現的介面 這是一個類似出發器的東西
public class SendRejectionMail implements JavaDelegate {
@Override
public void execute(DelegateExecution delegateExecution) {
System.out.println(" 這裡模擬發一封郵件 --------------------- ");
System.out.println(" 請求被拒接了 , 資本家是吸血的 ");
}
}

`

八.檢視歷史任務

`
@Test
public void historyTaskQuery() {
// 注意看這裡
HistoryService service = processEngine.getHistoryService();
List list = service.createHistoricActivityInstanceQuery()
.processDefinitionId("holidayRequest:1:12503")
.finished()
.list();
list.forEach((o)->{
System.out.println(o.getActivityName());
System.out.println(o.getActivityId());
System.out.println(o.getAssignee());
});
}

`

關於畫流程圖

視訊中的波哥使用的是 Eclipse
如果你會使用 docker 的話
去dockerhub 拉一個映象
https://hub.docker.com/r/flowable/flowable-ui
啟動後訪問 ip:8080/flowable-ui/modeler/
user:admin
password : test