自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
個(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 等寫的。

前面的文章我們一起玩了 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 文件是什么樣子:

<process id="demo01" name="測(cè)試流程" isExecutable="true">
<documentation>測(cè)試流程</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)嵌了一個(gè) script 節(jié)點(diǎn),里邊就是我們自己寫的腳本內(nèi)容。

好啦,接下來(lái)小伙伴們就可以部署并啟動(dòng)這個(gè)流程了,啟動(dòng)代碼如下:

@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());
}

大家注意啟動(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 依賴,如下:

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

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 方法。

責(zé)任編輯:武曉燕 來(lái)源: 江南一點(diǎn)雨
相關(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

防注入代碼繞過(guò)

2019-07-23 15:04:54

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

2020-10-27 07:51:12

Shell腳本日期

2015-03-27 11:34:59

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

2014-07-08 09:21:10

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

2018-06-19 08:02:00

統(tǒng)計(jì)程序微信

2020-11-20 07:51:02

JavaSPI機(jī)制

2018-11-02 16:16:41

程序硬盤存儲(chǔ)

2020-08-18 18:11:54

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

2024-03-04 08:45:30

JavaScript深度拷貝對(duì)象

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變量代碼

2018-06-23 08:02:31

程序員代碼故事

2022-12-06 08:12:11

Java關(guān)鍵字

2021-10-28 19:35:02

代碼main方法

2020-04-03 10:14:57

內(nèi)存蠕蟲代碼web安全
點(diǎn)贊
收藏

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