在 Java 代碼中來(lái)一段 JavaScript?聊聊 Flowable 中的腳本任務(wù)
前面的文章我們一起玩了 Flowable 中的 ServiceTask,今天我們?cè)賮?lái)看看 Flowable 中的腳本任務(wù)。
1. 腳本任務(wù)
個(gè)人感覺(jué)腳本任務(wù)和我們前面說(shuō)的 ServiceTask 很像,都是流程走到這個(gè)節(jié)點(diǎn)的時(shí)候自動(dòng)做一些事情,不同的是,在 ServiceTask 中,流程在這個(gè)節(jié)點(diǎn)中所做的事情是用 Java 代碼寫的,在腳本任務(wù)中,流程在這個(gè)節(jié)點(diǎn)中所做的事情則是用其他一些腳本語(yǔ)言如 JavaScript、Groovy、Juel 等寫的。
腳本任務(wù)的圖標(biāo)如下圖所示:
2. 實(shí)踐
寫一個(gè)簡(jiǎn)單的例子我們來(lái)一起看下。
2.1 JavaScript 腳本
我們先來(lái)看用 JavaScript 寫這個(gè)腳本。
假設(shè)我有如下流程圖:
中間這個(gè)節(jié)點(diǎn)就是一個(gè)腳本任務(wù)。
選中該節(jié)點(diǎn),我們先配置腳本語(yǔ)言是 JavaScript,如下圖:
這里也可以使用簡(jiǎn)寫的 js。
然后再點(diǎn)擊右邊的腳本,配置腳本,如下圖:
上面這里我寫了兩行 JavaScript 腳本:
第一行表示流程執(zhí)行到這里的時(shí)候,需要做一個(gè)簡(jiǎn)單的加法運(yùn)算,a 和 b 兩個(gè)變量則需要流程傳入進(jìn)來(lái)。
第二行表示往流程中存儲(chǔ)一個(gè)名為 sum 的變量,變量值就是前面計(jì)算的結(jié)果,其中 execution 是一個(gè)內(nèi)置變量。這個(gè)就類似于我們啟動(dòng)流程時(shí)候傳入的變量一樣。
在 ES6 中我們常用的 let 關(guān)鍵字這里并不支持,這個(gè)地方小伙伴們要注意。
配置完成之后,我們下載這個(gè)腳本來(lái)看下對(duì)應(yīng)的 XML 文件是什么樣子:
小伙伴們看到,scriptTask 中內(nèi)嵌了一個(gè) script 節(jié)點(diǎn),里邊就是我們自己寫的腳本內(nèi)容。
好啦,接下來(lái)小伙伴們就可以部署并啟動(dòng)這個(gè)流程了,啟動(dòng)代碼如下:
大家注意啟動(dòng)的時(shí)候傳遞 a 和 b 兩個(gè)變量。這個(gè)流程啟動(dòng)之后,直接就執(zhí)行結(jié)束了,因?yàn)榱鞒痰竭_(dá) scriptTask 并不會(huì)停止。
不過(guò)我們可以在 ACT_HI_VARINST 表中查看流程運(yùn)行信息:
可以看到,相關(guān)的變量和變量值都保存著。
2.2 Groovy 腳本
看懂了 JavaScript 腳本,Groovy 就好懂了。不過(guò) JavaScript 腳本估計(jì)大部分搞 Java 的小伙伴都懂,但是 Groovy 可能會(huì)比較陌生,我簡(jiǎn)單介紹下:
Groovy 是 Apache 旗下的一門基于 JVM 平臺(tái)的動(dòng)態(tài)/敏捷編程語(yǔ)言,在語(yǔ)言的設(shè)計(jì)上它吸納了 Python、Ruby 和 Smalltalk 語(yǔ)言的優(yōu)秀特性,語(yǔ)法非常簡(jiǎn)練和優(yōu)美,開發(fā)效率也非常高(編程語(yǔ)言的開發(fā)效率和性能是相互矛盾的,越高級(jí)的編程語(yǔ)言性能越差,因?yàn)橐馕吨嗟讓拥姆庋b,不過(guò)開發(fā)效率會(huì)更高,需結(jié)合使用場(chǎng)景做取舍)。并且,Groovy 可以與 Java 語(yǔ)言無(wú)縫對(duì)接,在寫 Groovy 的時(shí)候如果忘記了語(yǔ)法可以直接按 Java 的語(yǔ)法繼續(xù)寫,也可以在 Java 中調(diào)用 Groovy 腳本,都可以很好的工作,這有效的降低了 Java 開發(fā)者學(xué)習(xí) Groovy 的成本。Groovy 也并不會(huì)替代 Java,而是相輔相成、互補(bǔ)的關(guān)系,具體使用哪門語(yǔ)言這取決于要解決的問(wèn)題和使用的場(chǎng)景。
如果我們想要在流程中使用 Groovy 腳本,那么首先設(shè)置腳本格式為 Groovy:
然后設(shè)置腳本內(nèi)容如下:
這段腳本表示流程執(zhí)行到這個(gè)節(jié)點(diǎn)的時(shí)候輸出一個(gè) "hello groovy"(如果你熟悉 Groovy 腳本的話,就知道這段腳本其實(shí)也可以直接寫 Java 代碼,也能執(zhí)行)。
另外說(shuō)一句,使用 Groovy 腳本,千萬(wàn)別忘了加 Groovy 依賴,如下:
2.3 Juel 腳本
Juel? 是 Java Unified Expression Language 的簡(jiǎn)稱,它具有高性能,插件式緩存,小體積,支持方法調(diào)用和多參數(shù)調(diào)用,可插拔等多種特性,它是 JSP2.1 標(biāo)準(zhǔn) (JSR-245) 中定義的一部分。盡管 EL 表達(dá)式是伴隨著 JSP 而生,但現(xiàn)在已經(jīng)可以在非 JS P應(yīng)用中使用,相關(guān)的 API 放在 javax.el 包里面。
其實(shí)像我們之前寫的 ${xxx} 這種表達(dá)式,其實(shí)就是 Juel 了。
來(lái)一個(gè)簡(jiǎn)單的例子看下。假設(shè)我們想在流程中使用 juel,首先設(shè)置腳本格式為 juel:
然后就可以設(shè)置具體的腳本內(nèi)容了,如下:
這段腳本就表示調(diào)用一個(gè)名為 myServiceTask2 的 Bean 中的 hello 方法。