成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Flowable 服務任務執行的三種方式

開發 項目管理
ServiceTask 一般由系統自動完成,當流程走到這一步的時候,不會自動停下來,而是會去執行我們提前在 ServiceTask 中配置好的方法。

前面和小伙伴們分別聊了 Flowable 中的 ReceiveTask 和 UserTask,今天我們來看看另外一個比較常見的 Task --> ServiceTask。

1. ServiceTask

ServiceTask 從名字上看就是服務任務,它的圖標一般是像下面這樣:

圖片

ServiceTask 一般由系統自動完成,當流程走到這一步的時候,不會自動停下來,而是會去執行我們提前在 ServiceTask 中配置好的方法。

2. 實踐

我們通過一個簡單的例子來看一下 ServiceTask 要怎么玩。

假設我有如下一個簡單的流程圖:

圖片

中間這個就是一個 ServiceTask。

當流程執行到 ServiceTask 的時候,具體要做哪些事情?有三種不同的方式來設置這里的任務,我們分別來看。

2.1 監聽類

首先我們可以設置一個監聽類,這個監聽類有一個硬性規定就是需要實現 JavaDelegate 接口,像下面這樣:

public class MyServiceTask implements JavaDelegate {
@Override
public void execute(DelegateExecution execution){
System.out.println("========MyServiceTask==========");
}
}

在這個監聽類中我們可以完成一些操作,通過這個 execution 也可以獲取到在流程節點之間傳輸的變量。

這個類定義好之后,接下來我們在流程定義的時候,配置這個類的全路徑即可,如下圖:

圖片

這個配置對應的 XML 內容如下:

<process id="demo01" name="測試流程" isExecutable="true">
<documentation>測試流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidatinotallow="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:class="org.javaboy.flowableidm.MyServiceTask"></serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>

小伙伴們看到,在 ServiceTask 標簽中的 flowable:class="org.javaboy.flowableidm.MyServiceTask" 就表示 ServiceTask 執行的服務類。

配置完成后,我們可以部署并啟動這個流程,由于這個流程除了開始和結束,就這一個節點,所以流程一啟動就自動結束了。不過在這個過程中,我們可以看到控制臺打印出來了日志,說明這個 ServiceTask 確實是執行了。

2.2 委托表達式

我們也可以配置委托表達式。

委托表達式是指將一個實現了 JavaDelegate 接口的類注冊到 Spring 容器中,然后我們在流程節點的配置中不用寫完整的類名了,只需要寫 Spring 容器中的 Bean 名稱即可。

像下面這樣:

@Component
public class MyServiceTask implements JavaDelegate {
@Override
public void execute(DelegateExecution execution){
System.out.println("========MyServiceTask==========");
}
}

這個類注冊到 Spring 容器中的默認名稱是類名首字母小寫,即 myServiceTask。

現在我們在流程圖中,可以按照如下方式進行配置:

圖片

對應的 XML 文件如下:

<process id="demo01" name="測試流程" isExecutable="true">
<documentation>測試流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidatinotallow="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:delegateExpressinotallow="${myServiceTask}"></serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>

可以看到,flowable:delegateExpressinotallow="${myServiceTask}" 就表示執行的一個表達式。

測試過程同 2.1 小節,我就不再贅述了。

最后總結一下,委托表達式,一定是 JavaDelegate 接口的實現類,將這個實現類注冊到 Spring 容器中,然后在使用的時候,根據 Bean 的名稱從 Spring 容器中查找即可。

2.3 表達式

我們也可以使用表達式。

表達式就是一個普通類的普通方法,將這個普通類注冊到 Spring 容器中,然后表達式中還可以執行這個類中的方法,類似下面這樣,任意定義一個 Java 類:

@Component
public class MyServiceTask2 {
public void hello(){
System.out.println("========MyServiceTask2==========");
}
}

然后在流程圖中按照如下方式進行配置:

圖片

表達式中有一部分內容隱藏了,完整的表達式是 ${myServiceTask2.hello()}。

對應的 XML 文件如下:

<process id="demo01" name="測試流程" isExecutable="true">
<documentation>測試流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidatinotallow="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:expressinotallow="${myServiceTask2.hello()}"></serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>

可以看到,表達式的內容是 flowable:expressinotallow="${myServiceTask2.hello()}。

測試方式同 2.1 小節,這里我不再贅述。

3. 類中字段

可能有小伙伴注意到,我們在繪制流程圖的時候,還可以為類設置一個字段。

例如我想給 ServiceTask 的執行類設置一個 username 字段,如下:

圖片

圖片

設置完成后,對應的 XML 如下:

<process id="demo01" name="測試流程" isExecutable="true">
<documentation>測試流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidatinotallow="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8"></sequenceFlow>
<serviceTask id="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" flowable:delegateExpressinotallow="${myServiceTask}">
<extensionElements>
<flowable:field name="username">
<flowable:string><![CDATA[javaboy]]></flowable:string>
</flowable:field>
</extensionElements>
</serviceTask>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-6FA66E2A-F8E6-4F10-8FA2-6450408E17D8" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
</process>

可以看到,這里通過 extensionElements 節點描述了額外的信息。

接下來,我們就可以在 Java 類中訪問到這個變量了,如下:

@Component
public class MyServiceTask implements JavaDelegate {
Expression username;
@Override
public void execute(DelegateExecution execution){
System.out.println("username.getExpressionText() = " + username.getExpressionText());
System.out.println("username.getValue(execution) = " + username.getValue(execution));
System.out.println("========MyServiceTask==========");
}
}

想要獲取到 username 對應的值,上面這段代碼中,松哥給大家演示了兩種方式。

不過需要注意,這種設置類中字段的方式,適用于 2.1 和 2.2 小節的情況,不適用于 2.3 小節的情況。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2025-01-08 09:55:37

Spring接口數據庫

2012-07-17 09:16:16

SpringSSH

2022-10-09 18:16:01

Flowable設置ReceiveTas

2020-11-01 17:10:46

異步事件開發前端

2009-11-06 10:54:19

WCF服務方式

2021-11-05 21:33:28

Redis數據高并發

2019-11-20 18:52:24

物聯網智能照明智能恒溫器

2014-12-31 17:42:47

LBSAndroid地圖

2021-06-24 08:52:19

單點登錄代碼前端

2010-03-12 17:52:35

Python輸入方式

2022-10-25 15:25:22

網關并行Flowable

2024-09-20 05:49:04

SpringBoot后端

2013-06-17 17:08:47

Windows PhoWP開發共享數據方式

2011-06-03 11:53:06

Spring接口

2015-01-05 09:56:20

可穿戴設備

2023-10-18 11:12:01

增強現實VR

2009-07-20 15:08:41

Spring實例化Be

2022-08-19 11:19:49

單元測試Python

2024-07-08 09:03:31

2010-08-24 09:43:33

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久高清国产视频 | 精品国产乱码久久久久久牛牛 | 成人中文字幕在线 | 91久久夜色精品国产网站 | 一区二区在线不卡 | 久久久久久久久久久高潮一区二区 | 日韩电影免费在线观看中文字幕 | 免费在线视频一区二区 | 夜夜草天天草 | 国产精品毛片一区二区三区 | 国产欧美精品 | 日本天堂一区二区 | 精品国产乱码久久久久久蜜柚 | 精品国产一区二区三区久久 | 精品视频一区二区在线观看 | 欧美一级欧美三级在线观看 | 欧美区在线 | 在线观看国产h | 久久久免费少妇高潮毛片 | 一区二区三区视频在线 | 亚洲精品久久久久中文字幕欢迎你 | 粉嫩av在线 | 久久99精品久久久久久国产越南 | 色资源在线 | 一级片在线免费播放 | 国产精品免费在线 | 1000部精品久久久久久久久 | 国产夜恋视频在线观看 | 免费视频一区 | 欧美日韩专区 | 国产一区二区三区久久久久久久久 | 三级成人片 | 亚洲国产欧美日韩 | 日韩福利| 国产乱码一区 | 久久精品国产免费一区二区三区 | 久久国产电影 | 久草视频网站 | 三级高清 | 一级免费在线视频 | 艹逼网|