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

在 Java 代碼中來一段 JavaScript?聊聊 Flowable 中的腳本任務(wù)

開發(fā) 前端
個人感覺腳本任務(wù)和我們前面說的 ServiceTask 很像,都是流程走到這個節(jié)點的時候自動做一些事情,不同的是,在 ServiceTask 中,流程在這個節(jié)點中所做的事情是用 Java 代碼寫的,在腳本任務(wù)中,流程在這個節(jié)點中所做的事情則是用其他一些腳本語言如 JavaScript、Groovy、Juel 等寫的。

前面的文章我們一起玩了 Flowable 中的 ServiceTask,今天我們再來看看 Flowable 中的腳本任務(wù)。

1. 腳本任務(wù)

個人感覺腳本任務(wù)和我們前面說的 ServiceTask 很像,都是流程走到這個節(jié)點的時候自動做一些事情,不同的是,在 ServiceTask 中,流程在這個節(jié)點中所做的事情是用 Java 代碼寫的,在腳本任務(wù)中,流程在這個節(jié)點中所做的事情則是用其他一些腳本語言如 JavaScript、Groovy、Juel 等寫的。

腳本任務(wù)的圖標如下圖所示:

圖片

2. 實踐

寫一個簡單的例子我們來一起看下。

2.1 JavaScript 腳本

我們先來看用 JavaScript 寫這個腳本。

假設(shè)我有如下流程圖:

圖片

中間這個節(jié)點就是一個腳本任務(wù)。

選中該節(jié)點,我們先配置腳本語言是 JavaScript,如下圖:

圖片

這里也可以使用簡寫的 js。

然后再點擊右邊的腳本,配置腳本,如下圖:

圖片

上面這里我寫了兩行 JavaScript 腳本:

第一行表示流程執(zhí)行到這里的時候,需要做一個簡單的加法運算,a 和 b 兩個變量則需要流程傳入進來。

第二行表示往流程中存儲一個名為 sum 的變量,變量值就是前面計算的結(jié)果,其中 execution 是一個內(nèi)置變量。這個就類似于我們啟動流程時候傳入的變量一樣。

在 ES6 中我們常用的 let 關(guān)鍵字這里并不支持,這個地方小伙伴們要注意。

配置完成之后,我們下載這個腳本來看下對應(yīng)的 XML 文件是什么樣子:

<process id="demo01" name="測試流程" isExecutable="true">
<documentation>測試流程</documentation>
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<sequenceFlow id="sid-33A78082-C2FD-48BE-8B87-99FB20F0B331" sourceRef="startEvent1" targetRef="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094"></sequenceFlow>
<endEvent id="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></endEvent>
<sequenceFlow id="sid-0698809E-0A6C-4B92-A167-AE96A8CB75F2" sourceRef="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094" targetRef="sid-A5F11956-15EA-4574-98D0-29A4E3DB5495"></sequenceFlow>
<scriptTask id="sid-8D88DFF6-0F37-42FA-9F94-29FE30536094" scriptFormat="JavaScript" flowable:autoStoreVariables="false">
<script><![CDATA[var sum=a+b;
execution.setVariable("sum",sum);]]></script>
</scriptTask>
</process>

小伙伴們看到,scriptTask 中內(nèi)嵌了一個 script 節(jié)點,里邊就是我們自己寫的腳本內(nèi)容。

好啦,接下來小伙伴們就可以部署并啟動這個流程了,啟動代碼如下:

@Test
void test01(){
Map<String, Object> variables = new HashMap<>();
variables.put("a", 99);
variables.put("b", 98);
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01", variables);
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}

大家注意啟動的時候傳遞 a 和 b 兩個變量。這個流程啟動之后,直接就執(zhí)行結(jié)束了,因為流程到達 scriptTask 并不會停止。

不過我們可以在 ACT_HI_VARINST 表中查看流程運行信息:

圖片

可以看到,相關(guān)的變量和變量值都保存著。

2.2 Groovy 腳本

看懂了 JavaScript 腳本,Groovy 就好懂了。不過 JavaScript 腳本估計大部分搞 Java 的小伙伴都懂,但是 Groovy 可能會比較陌生,我簡單介紹下:

Groovy 是 Apache 旗下的一門基于 JVM 平臺的動態(tài)/敏捷編程語言,在語言的設(shè)計上它吸納了 Python、Ruby 和 Smalltalk 語言的優(yōu)秀特性,語法非常簡練和優(yōu)美,開發(fā)效率也非常高(編程語言的開發(fā)效率和性能是相互矛盾的,越高級的編程語言性能越差,因為意味著更多底層的封裝,不過開發(fā)效率會更高,需結(jié)合使用場景做取舍)。并且,Groovy 可以與 Java 語言無縫對接,在寫 Groovy 的時候如果忘記了語法可以直接按 Java 的語法繼續(xù)寫,也可以在 Java 中調(diào)用 Groovy 腳本,都可以很好的工作,這有效的降低了 Java 開發(fā)者學習 Groovy 的成本。Groovy 也并不會替代 Java,而是相輔相成、互補的關(guān)系,具體使用哪門語言這取決于要解決的問題和使用的場景。

如果我們想要在流程中使用 Groovy 腳本,那么首先設(shè)置腳本格式為 Groovy:

圖片

然后設(shè)置腳本內(nèi)容如下:

圖片

這段腳本表示流程執(zhí)行到這個節(jié)點的時候輸出一個 "hello groovy"(如果你熟悉 Groovy 腳本的話,就知道這段腳本其實也可以直接寫 Java 代碼,也能執(zhí)行)。

另外說一句,使用 Groovy 腳本,千萬別忘了加 Groovy 依賴,如下:

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.13</version>
</dependency>

2.3 Juel 腳本

Juel? 是 Java Unified Expression Language 的簡稱,它具有高性能,插件式緩存,小體積,支持方法調(diào)用和多參數(shù)調(diào)用,可插拔等多種特性,它是 JSP2.1 標準 (JSR-245) 中定義的一部分。盡管 EL 表達式是伴隨著 JSP 而生,但現(xiàn)在已經(jīng)可以在非 JS P應(yīng)用中使用,相關(guān)的 API 放在 javax.el 包里面。

其實像我們之前寫的 ${xxx} 這種表達式,其實就是 Juel 了。

來一個簡單的例子看下。假設(shè)我們想在流程中使用 juel,首先設(shè)置腳本格式為 juel:

圖片

然后就可以設(shè)置具體的腳本內(nèi)容了,如下:

圖片

這段腳本就表示調(diào)用一個名為 myServiceTask2 的 Bean 中的 hello 方法。

責任編輯:武曉燕 來源: 江南一點雨
相關(guān)推薦

2022-06-21 12:27:12

JavaScript前端

2012-03-01 14:13:36

Java

2023-09-05 09:42:18

if分支源碼

2020-12-31 10:14:42

防注入代碼繞過

2019-07-23 15:04:54

JavaScript調(diào)用棧事件循環(huán)

2020-10-27 07:51:12

Shell腳本日期

2025-06-11 08:20:00

JVM線程代碼

2014-07-08 09:21:10

死代碼創(chuàng)意歌曲

2015-03-27 11:34:59

JavaJava編寫引發(fā)內(nèi)存泄露

2018-06-19 08:02:00

統(tǒng)計程序微信

2020-11-20 07:51:02

JavaSPI機制

2018-11-02 16:16:41

程序硬盤存儲

2024-03-04 08:45:30

JavaScript深度拷貝對象

2020-08-18 18:11:54

架構(gòu)師腳本語言

2021-02-04 07:55:28

代碼離職互聯(lián)網(wǎng)

2023-04-06 00:22:19

JavaScrip任務(wù)開發(fā)

2021-07-26 23:39:20

Java變量代碼

2022-12-06 08:12:11

Java關(guān)鍵字

2022-04-02 08:14:02

JavaThreadLoca數(shù)據(jù)

2021-12-11 19:00:54

Java中斷機制
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久三级 | 精品在线一区二区三区 | 久久久久久综合 | 欧美精品在线播放 | 久久精品97| 国产视频二区在线观看 | 日韩欧美视频在线 | 日韩在线免费视频 | 国产98色在线 | 日韩 | 国产精品不卡一区 | 免费黄色成人 | 成人一区二区三区在线观看 | 国产成人精品一区二区三区四区 | av中文字幕在线播放 | 日本高清精品 | 古装三级在线播放 | 最新中文字幕 | 日韩久久综合 | 日韩视频 中文字幕 | 国产在线网站 | 久久精品二区 | 在线一级片 | 亚洲精品二区 | 久久成人高清视频 | 亚洲成av人片在线观看 | 国产精品毛片久久久久久久 | 一区二区三区视频在线观看 | 久久久久国产 | 天天草av | 亚洲成人一区二区 | 精品视频一区二区三区 | 欧美jizzhd精品欧美巨大免费 | 成人精品久久 | 精品视频久久久久久 | 国产欧美一级二级三级在线视频 | 九九九久久国产免费 | 午夜视频免费在线观看 | 91国产在线播放 | 99re视频精品 | 久久狼人天堂 | 一区二区三区中文字幕 |