欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flowable執(zhí)行完畢的流程查找方法

 更新時(shí)間:2022年11月10日 14:27:54   作者:江南一點(diǎn)雨  
這篇文章主要為大家介紹了Flowable執(zhí)行完畢的流程查找方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

@[toc]
在之前的文章中松哥和小伙伴們聊過(guò),正在執(zhí)行的流程信息是保存在以 ACT_RU_ 為前綴的表中,執(zhí)行完畢的流程信息則保存在以 ACT_HI_ 為前綴的表中,也就是流程歷史信息表,當(dāng)然這個(gè)歷史信息表繼續(xù)細(xì)分的話,還有好多種,今天我們就來(lái)聊一聊這個(gè)話題。

假設(shè)我有如下一個(gè)流程:

當(dāng)這個(gè)流程執(zhí)行完畢后,以 ACT_RU_ 為前綴的表中的數(shù)據(jù)均已清空,現(xiàn)在如果想查看剛剛執(zhí)行過(guò)的流程信息,我們就得去以 ACT_HI_ 為前綴的表中。

1. 歷史流程信息

歷史流程信息查看,方式如下:

@Test
void test05() {
    List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().finished().list();
    for (HistoricProcessInstance hpi : list) {
        logger.info("name:{},startTime:{},endTime:{}",hpi.getName(),hpi.getStartTime(),hpi.getEndTime());
    }
}

調(diào)用的時(shí)候執(zhí)行的 finished() 方法表示查詢已經(jīng)執(zhí)行完畢的流程信息(從這里也可以看出,對(duì)于未執(zhí)行完畢的流程信息也會(huì)保存在歷史表中)。

我們來(lái)看下這個(gè)查詢對(duì)應(yīng)的 SQL,如下:

SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ is not NULL order by RES.ID_ asc

從這個(gè) SQL 中可以看到,這個(gè)查詢本質(zhì)上就是查詢的 ACT_HI_PROCINST 表。如下圖:

如果我們?cè)诓樵兊臅r(shí)候不限制流程是否執(zhí)行完畢,那么我們的查詢方法如下:

@Test
void test05() {
    List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list();
    for (HistoricProcessInstance hpi : list) {
        logger.info("name:{},startTime:{},endTime:{}",hpi.getName(),hpi.getStartTime(),hpi.getEndTime());
    }
}

對(duì)應(yīng)的查詢 SQL 如下:

SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ order by RES.ID_ asc

和前面的 SQL 相比,后面的 SQL 少了 WHERE RES.END_TIME_ is not NULL 條件,也就是說(shuō),判斷一個(gè)流程是否執(zhí)行完畢,就看它的 END_TIME_ 是否為空,不為空就表示流程已經(jīng)執(zhí)行結(jié)束了,為空就表示流程尚在執(zhí)行中。

2. 歷史任務(wù)查詢

剛剛我們查詢的是歷史流程,接下來(lái)我們來(lái)看下歷史任務(wù),也就是查詢一個(gè)流程中執(zhí)行過(guò)的 Task 信息,如下表示查詢所有的歷史流程任務(wù):

@Test
void test06() {
    List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().list();
    for (HistoricTaskInstance hti : list) {
        logger.info("name:{},assignee:{},createTime:{},endTime:{}",hti.getName(),hti.getAssignee(),hti.getCreateTime(),hti.getEndTime());
    }
}

這個(gè)查詢對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_TASKINST RES order by RES.ID_ asc

可以看到,歷史任務(wù)表就是 ACT_HI_TASKINST,如下圖:

當(dāng)然,這里還有很多其他的玩法,例如查詢某一個(gè)流程已經(jīng)執(zhí)行完畢的歷史任務(wù),如下:

@Test
void test07() {
    List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery().list();
    for (HistoricProcessInstance hpi : instanceList) {
        List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processInstanceId(hpi.getId()).finished().list();
        for (HistoricTaskInstance hti : list) {
            logger.info("name:{},assignee:{},createTime:{},endTime:{}", hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime());
        }
    }
}

這個(gè)里邊的查詢歷史任務(wù)的 SQL 如下:

SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? and RES.END_TIME_ is not null order by RES.ID_ asc

可以看到,跟前面相比,多了兩個(gè)條件:

  • 流程實(shí)例 ID
  • 流程結(jié)束時(shí)間不為 null

從這里也可以看出來(lái),這個(gè) finish 方法的執(zhí)行邏輯跟我們前面講的是一樣的。

3. 歷史活動(dòng)查詢

歷史任務(wù)就是各種 Task,歷史活動(dòng)則包括跟多內(nèi)容,像開(kāi)始/結(jié)束節(jié)點(diǎn),連線等等這些信息都算是活動(dòng),這個(gè)在之前的文章中松哥已經(jīng)和大家介紹過(guò)了。

查詢代碼如下:

@Test
void test08() {
    List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().list();
    for (HistoricActivityInstance hai : list) {
        logger.info("name:{},startTime:{},assignee:{},type:{}",hai.getActivityName(),hai.getStartTime(),hai.getAssignee(),hai.getActivityType());
    }
}

這個(gè)查詢對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_ACTINST RES order by RES.ID_ asc

可以看到,ACT_HI_ACTINST 表中保存了歷史活動(dòng)信息。

4. 歷史變量查詢

查詢流程執(zhí)行的歷史變量,方式如下:

@Test
void test09() {
    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();
    List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(pi.getId()).list();
    for (HistoricVariableInstance hvi : list) {
        logger.info("name:{},type:{},value:{}", hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());
    }
}

這個(gè)查詢對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc

可以看到流程的歷史變量信息保存在 ACT_HI_VARINST 表中。

5. 歷史日志查詢

有的小伙伴看到日志這兩個(gè)字可能會(huì)覺(jué)得奇怪,咦?流程執(zhí)行還有日志嗎?沒(méi)聽(tīng)說(shuō)過(guò)呀!

其實(shí)歷史日志查詢就是前面那幾種的一個(gè)集大成者,用法如下:

@Test
void test10() {
    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();
    ProcessInstanceHistoryLog historyLog = historyService.createProcessInstanceHistoryLogQuery(pi.getId())
            //包括歷史活動(dòng)
            .includeActivities()
            //包括歷史任務(wù)
            .includeTasks()
            //包括歷史變量
            .includeVariables()
            .singleResult();
    logger.info("id:{},startTime:{},endTime:{}", historyLog.getId(), historyLog.getStartTime(), historyLog.getEndTime());
    List<HistoricData> historicData = historyLog.getHistoricData();
    for (HistoricData data : historicData) {
        if (data instanceof HistoricActivityInstance) {
            HistoricActivityInstance hai = (HistoricActivityInstance) data;
            logger.info("name:{},type:{}", hai.getActivityName(), hai.getActivityType());
        }
        if (data instanceof HistoricTaskInstance) {
            HistoricTaskInstance hti = (HistoricTaskInstance) data;
            logger.info("name:{},assignee:{}", hti.getName(), hti.getAssignee());
        }
        if (data instanceof HistoricVariableInstance) {
            HistoricVariableInstance hvi = (HistoricVariableInstance) data;
            logger.info("name:{},type:{},value:{}", hvi.getVariableName(), hvi.getVariableTypeName(), hvi.getValue());
        }
    }
}

這個(gè)里邊,首先是查詢基本的流程日志信息,這個(gè)本質(zhì)上就是查詢歷史流程實(shí)例信息,對(duì)應(yīng)的 SQL 如下:

select RES.*, DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ where PROC_INST_ID_ = ?

接下來(lái)我寫(xiě)了三個(gè) include,每一個(gè) include 都對(duì)應(yīng)一句 SQL:

includeActivities 對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc

includeTasks 對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc

includeVariables 對(duì)應(yīng)的 SQL 如下:

SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc

最終查詢完成后,調(diào)用 getHistoricData 方法可以查看這些額外的數(shù)據(jù),List 集合中存放的 HistoricData 也分為不同的類(lèi)型:

  • includeActivities 方法對(duì)應(yīng)最終查詢出來(lái)的類(lèi)型是 HistoricActivityInstance。
  • includeTasks 方法對(duì)應(yīng)最終查詢出來(lái)的類(lèi)型是 HistoricTaskInstance。
  • includeVariables 方法對(duì)應(yīng)最終查詢出來(lái)的類(lèi)型是 HistoricVariableInstance。

在遍歷的時(shí)候通過(guò)類(lèi)型判斷去查看具體是哪一種變量類(lèi)型。

綜上,這個(gè)歷史日志查詢其實(shí)就是一個(gè)集大成者。

6. 歷史權(quán)限查詢

這個(gè)是用來(lái)查詢流程或者任務(wù)的處理人,例如查詢流程的處理人,方式如下:

@Test
void test11() {
    HistoricProcessInstance pi = historyService.createHistoricProcessInstanceQuery().singleResult();
    List<HistoricIdentityLink> links = historyService.getHistoricIdentityLinksForProcessInstance(pi.getId());
    for (HistoricIdentityLink link : links) {
        logger.info("userId:{}",link.getUserId());
    }
}

這個(gè)是查詢流程對(duì)應(yīng)的處理人,對(duì)應(yīng)的 SQL 如下:

select * from ACT_HI_IDENTITYLINK where PROC_INST_ID_ = ?

如果想查詢?nèi)蝿?wù)的處理人,對(duì)應(yīng)的方式如下:

@Test
void test12() {
    String taskName = "提交請(qǐng)假申請(qǐng)";
    HistoricTaskInstance hti = historyService.createHistoricTaskInstanceQuery().taskName(taskName).singleResult();
    List<HistoricIdentityLink> links = historyService.getHistoricIdentityLinksForTask(hti.getId());
    for (HistoricIdentityLink link : links) {
        logger.info("{} 任務(wù)的處理人是 {}",taskName,link.getUserId());
    }
}

這個(gè)查詢對(duì)應(yīng)的 SQL 如下:

select * from ACT_HI_IDENTITYLINK where TASK_ID_ = ?

和前面的相比,其實(shí)就多了一個(gè)查詢條件 TASK_ID_。

7. 自定義查詢 SQL

和前面講的很多查詢類(lèi)似,當(dāng)我們弄懂了每一個(gè)歷史查詢的 API 操作的是哪一個(gè)數(shù)據(jù)表,就會(huì)發(fā)現(xiàn),歷史數(shù)據(jù)的查詢,也可以自定義 SQL。

舉個(gè)例子和小伙伴們看下,例如查詢某一個(gè)流程已經(jīng)執(zhí)行完畢的歷史任務(wù):

@Test
void test13() {
    List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery().list();
    for (HistoricProcessInstance hpi : instanceList) {
        List<HistoricTaskInstance> list = historyService.createNativeHistoricTaskInstanceQuery()
                .sql("SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = #{pid} and RES.END_TIME_ is not null order by RES.ID_ asc")
                .parameter("pid",hpi.getId()).list();
        for (HistoricTaskInstance hti : list) {
            logger.info("name:{},assignee:{},createTime:{},endTime:{}", hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime());
        }
    }
}

flowable 底層是 MyBatis,所有 SQL 中參數(shù)的傳遞形式和 MyBatis 一致。

8. 歷史數(shù)據(jù)記錄級(jí)別

Flowable 需要記錄哪些歷史數(shù)據(jù),有一個(gè)日志級(jí)別用來(lái)描述這個(gè)事情,默認(rèn)有四種級(jí)別:

  • None: 這個(gè)表示不存儲(chǔ)任何歷史信息,好處是流程執(zhí)行的時(shí)候效率會(huì)比較快,壞處是流程執(zhí)行結(jié)束后,看不到曾經(jīng)執(zhí)行過(guò)的流程信息了。
  • Activity: 這個(gè)會(huì)存儲(chǔ)所有流程實(shí)例和活動(dòng)實(shí)例,在流程實(shí)例結(jié)束時(shí),頂級(jí)流程實(shí)例變量的最新值將復(fù)制到歷史變量實(shí)例中,不會(huì)存儲(chǔ)詳細(xì)信息。
  • Audit: 在 Activity 的基礎(chǔ)上,還會(huì)存儲(chǔ)歷史詳細(xì)信息,包括權(quán)限信息等。默認(rèn)的日志記錄級(jí)別即次。
  • Full: 這個(gè)是在 Audit 的基礎(chǔ)上,還會(huì)存儲(chǔ)變量的變化信息,這會(huì)記錄大量的數(shù)據(jù),也會(huì)導(dǎo)致流程執(zhí)行變慢。

一共就這四種級(jí)別,在 Spring Boot 項(xiàng)目中,如果我們想要配置這個(gè)日志記錄的級(jí)別,其實(shí)非常方便,直接在 application.properties 中進(jìn)行配置即可,如下:

flowable.history-level=none

配置加了這個(gè)配置,我們隨便啟動(dòng)一個(gè)流程,然后去查詢 ACT_HI_ 系列的表,發(fā)現(xiàn)都是空的,沒(méi)有數(shù)據(jù)。

如果我們將歷史日志記錄的級(jí)別改為 activity,那么就會(huì)記錄下來(lái)流程信息以及活動(dòng)信息,但是像執(zhí)行的 Task 這些信息都是沒(méi)有的(ACT_HI_TASKINST),包括流程參與者的信息(ACT_HI_IDENTITYLINK)等都不會(huì)記錄下來(lái)。

如果我們將歷史日志記錄的級(jí)別改為 audit,則上面提到的這幾種日志就都會(huì)記錄下來(lái)。但是 ACT_HI_DETAIL 表還是空的,詳細(xì)一個(gè)流程變量的變化過(guò)程不會(huì)被記錄下來(lái)。

如果我們將日志記錄級(jí)別改為 full,那么將會(huì)記錄下更多的信息。ACT_HI_DETAIL 表中會(huì)記錄下流程變量的詳細(xì)信息。

以上就是Flowable執(zhí)行完畢的流程查找方法的詳細(xì)內(nèi)容,更多關(guān)于Flowable執(zhí)行完畢流程查找的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring MVC+FastJson+Swagger集成的完整實(shí)例教程

    Spring MVC+FastJson+Swagger集成的完整實(shí)例教程

    這篇文章主要給大家分享介紹了關(guān)于Spring MVC+FastJson+Swagger集成的完整實(shí)例教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • Java文件操作之序列化與對(duì)象處理流詳解

    Java文件操作之序列化與對(duì)象處理流詳解

    這篇文章主要為大家詳細(xì)介紹了Java文件操作中的序列化與對(duì)象處理流,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • InputStreamReader 和FileReader的區(qū)別及InputStream和Reader的區(qū)別

    InputStreamReader 和FileReader的區(qū)別及InputStream和Reader的區(qū)別

    這篇文章主要介紹了InputStreamReader 和FileReader的區(qū)別及InputStream和Reader的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 一文解析Java中的方法重寫(xiě)

    一文解析Java中的方法重寫(xiě)

    子類(lèi)繼承父類(lèi)后,可以在子類(lèi)中書(shū)寫(xiě)一個(gè)與父類(lèi)同名同參的方法,從而實(shí)現(xiàn)對(duì)父類(lèi)中同名同參數(shù)的方法的覆蓋,我們把這一過(guò)程叫做方法的重寫(xiě)。本文將分析一下Java中的方法重寫(xiě),感興趣的可以了解一下
    2022-07-07
  • 基于java文本復(fù)制的7種方式總結(jié)

    基于java文本復(fù)制的7種方式總結(jié)

    下面小編就為大家分享一篇基于java文本復(fù)制的7種方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot壓縮png, jpg, jpeg, webp類(lèi)型圖片的實(shí)現(xiàn)代碼

    SpringBoot壓縮png, jpg, jpeg, webp類(lèi)型圖片的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot壓縮png, jpg, jpeg, webp類(lèi)型圖片的實(shí)現(xiàn),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Java 的可變參數(shù)方法詳述

    Java 的可變參數(shù)方法詳述

    這篇文章主要介紹了Java 的可變參數(shù)方法,可變參數(shù)只能作為函數(shù)的最后一個(gè)參數(shù),在其前面可以有也可以沒(méi)有任何其他參數(shù),由于可變參數(shù)必須是最后一個(gè)參數(shù),所以一個(gè)函數(shù)最多只能有一個(gè)可變參數(shù),下面我們一起進(jìn)入文章了解更多關(guān)于可變參數(shù)的內(nèi)容吧
    2022-02-02
  • SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼

    SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼

    本篇文章主要介紹了SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-02-02
  • IDEA?一直scanning?files?to?index的四種完美解決方法(VIP典藏版)

    IDEA?一直scanning?files?to?index的四種完美解決方法(VIP典藏版)

    這篇文章主要介紹了IDEA?一直scanning?files?to?index的四種完美解決方法(VIP典藏版),推薦第四種方法,第四種方法摸索研究后得出,親測(cè)好用,需要的朋友參考下吧
    2023-10-10
  • springboot2自動(dòng)加載sql文件的實(shí)現(xiàn)

    springboot2自動(dòng)加載sql文件的實(shí)現(xiàn)

    本文主要介紹了springboot2自動(dòng)加載sql文件的實(shí)現(xiàn),通過(guò)配置文件或注解的方式,我們可以輕松地將SQL語(yǔ)句映射到數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)自動(dòng)加載,感興趣的可以了解一下
    2023-11-11

最新評(píng)論