日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Flowable流程實(shí)例的掛起(暫停)與激活

今天來(lái)和小伙伴們聊一聊流程的掛起和激活。

長(zhǎng)樂(lè)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,長(zhǎng)樂(lè)網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為長(zhǎng)樂(lè)上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的長(zhǎng)樂(lè)做網(wǎng)站的公司定做!

這塊實(shí)際上涉及到兩部分內(nèi)容:

流程定義的掛起和激活。

流程實(shí)例的掛起和激活。

一個(gè)定義好的流程,如果掛起了,那么就無(wú)法據(jù)此創(chuàng)建新的流程。

一個(gè)流程實(shí)例如果掛起了,那么就無(wú)法執(zhí)行流程中的任務(wù)。

小伙伴們注意區(qū)分這兩個(gè)概念(看了前面幾篇文章的小伙伴,應(yīng)該對(duì)于這兩個(gè)概念不在話下了)。

我們分別來(lái)看。

1. 流程定義的掛起與激活

1.1 查詢是否掛起

對(duì)于一個(gè)定義好的流程,我們可以通過(guò)如下方法來(lái)查看這個(gè)流程是否掛起:

@Test
void test05() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition processDefinition : list) {
String id = processDefinition.getId();
boolean suspended = repositoryService.isProcessDefinitionSuspended(id);
if (suspended) {
logger.info("流程定義 {} 已掛起",processDefinition.getName());
}else{
logger.info("流程定義 {} 未掛起",processDefinition.getName());
}
}
}

這個(gè)查詢 SQL 涉及到的表是 ACT_RE_PROCDEF,該表中有一個(gè)名為 SUSPENSION_STATE_ 的字段,該字段表示這個(gè)流程是否掛起。如下圖:

1 表示流程沒(méi)有掛起。

1.2 掛起

執(zhí)行如下方法,可以掛起一個(gè)流程定義,如下:

@Test
void test06() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.suspendProcessDefinitionById(pd.getId());
}
}

掛起的原理其實(shí)很簡(jiǎn)單,就是去 ACT_RE_PROCDEF 表中,將 SUSPENSION_STATE_ 字段的值設(shè)置為 2,就表示這個(gè)流程定義掛起了,我們可以看下流程定義掛起時(shí)執(zhí)行的 SQL:

從這個(gè)執(zhí)行的 SQL 中我們可以清晰的看到,操作的表是 ACT_RE_PROCDEF,修改的字段就是 SUSPENSION_STATE_,將該字段的值修改為 2(樂(lè)觀鎖相關(guān)的 REV_ 字段不考慮)。

對(duì)于一個(gè)已經(jīng)掛起的流程定義,如果我們想據(jù)此啟動(dòng)一個(gè)流程,如下:

@Test
void test01() {
identityService.setAuthenticatedUserId("wangwu");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("leave");
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

此時(shí)就會(huì)拋出如下異常:

這個(gè)異常說(shuō)的很明白了,流程定義被掛起了,無(wú)法開(kāi)啟一個(gè)新的流程實(shí)例。

1.3 激活

已經(jīng)掛起的流程定義,還可以激活,方式如下:

@Test
void test07() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.activateProcessDefinitionById(pd.getId());
}
}

激活的原理也很簡(jiǎn)單,,就是去 ACT_RE_PROCDEF 表中,將 SUSPENSION_STATE_ 字段的值設(shè)置為 1,就表示這個(gè)流程定義激活了,我們可以看下流程定義激活時(shí)執(zhí)行的 SQL:

大家注意看操作的表、字段以及對(duì)應(yīng)的參數(shù)。

2. 流程實(shí)例的掛起與激活

第一小節(jié)搞懂了,第二小節(jié)就容易多了。

2.1 掛起

掛起一個(gè)流程實(shí)例的方式如下:

@Test
void test08() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.suspendProcessDefinitionById(pd.getId(), true, null);
}
}

小伙伴們看到,其實(shí)還是剛才上面的那個(gè)方法,只不過(guò)這里多了兩個(gè)參數(shù):

第二個(gè)參數(shù) true 表示是否要掛起這個(gè)流程定義對(duì)應(yīng)的所有的流程實(shí)例,true 表示掛起。

第三個(gè)參數(shù) null 表示流程掛起的具體時(shí)間,如果該參數(shù)為 null,則流程會(huì)被立馬掛起,如果該參數(shù)是一個(gè)具體的日期,則到期之后流程才會(huì)被掛起,但是這個(gè)需要 job executor 的支持,關(guān)于 job executor,松哥后面再單獨(dú)發(fā)文章和小伙伴們介紹。

執(zhí)行完成之后,這個(gè)流程實(shí)例就被掛起了。流程實(shí)例被掛起,涉及到兩個(gè)地方:

流程的執(zhí)行實(shí)例被掛起。

流程的 Task 被掛起。

也就是首先 ACT_RU_EXECUTION 表中對(duì)應(yīng)的流程實(shí)例會(huì)被掛起:

最后一列兩個(gè) 2 就說(shuō)明這兩個(gè)執(zhí)行實(shí)例被掛起了。

同時(shí),流程實(shí)例的 Task 其實(shí)也被掛起了,即 ACT_RU_TASK 表中與之對(duì)應(yīng)的任務(wù)被掛起了,如下:

可以看到,SUSPENSION_STATE_ 字段的值為 2,表示這 Task 也被掛起了。

我們來(lái)看看掛起流程實(shí)例時(shí)執(zhí)行的 SQL:

注意,流程定義本身也被掛起了。

對(duì)于處于掛起狀態(tài)的流程實(shí)例,是無(wú)法繼續(xù)執(zhí)行的,如果強(qiáng)行執(zhí)行,如下:

@Test
void test03() {
List list = taskService.createTaskQuery().taskAssignee("wangwu").list();
for (Task task : list) {
taskService.complete(task.getId());
}
}

則會(huì)拋出異常,如下:

這個(gè)異常也說(shuō)的很清楚了,無(wú)法完成一個(gè)處于掛起狀態(tài)的 Task。

2.2 激活

處于掛起狀態(tài)的流程實(shí)例,可以通過(guò)如下方式激活:

@Test
void test09() {
List list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
repositoryService.activateProcessDefinitionById(pd.getId(), true, null);
}
}

一共三個(gè)參數(shù):

  • 流程定義的 ID。
  • 是否激活流程定義對(duì)應(yīng)的流程實(shí)例。
  • 激活流程實(shí)例的時(shí)間,null 表示立馬激活,如果是一個(gè)具體的時(shí)間,則到期激活,不過(guò)和之前的一樣,這里也需要 job executor 的支持。

激活就是反向操作,將 ACT_RU_EXECUTION、ACT_RU_TASK 以及 ACT_RE_PROCDEF 表中的 SUSPENSION_STATE_ 字段值再改為 1。對(duì)應(yīng)的 SQL 如下:


本文名稱:Flowable流程實(shí)例的掛起(暫停)與激活
當(dāng)前地址:http://www.5511xx.com/article/djsijoi.html