腳本任務(wù)是一個(gè)自動(dòng)活動(dòng)响驴,當(dāng)流程執(zhí)行到腳本任務(wù)時(shí)琼梆,相關(guān)的腳本自動(dòng)執(zhí)行。
一捌臊、定義腳本任務(wù)
腳本任務(wù)通過(guò)指定腳本和腳本格式來(lái)定義杨蛋。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
?????? scriptFormat腳本屬性的命名必須遵守Java平臺(tái)的JSR-223規(guī)范。如果想要使用JSR-223腳本引擎理澎,需要引入相關(guān)的jar包逞力,并且使用恰當(dāng)?shù)拿郑╯criptFormat的名字)。
?????? 腳本的源碼必須附加在script子元素的文本內(nèi)容里矾端。腳本源代碼可以指定為表達(dá)式或外部資源掏击,詳細(xì)請(qǐng)看用戶指南相關(guān)章節(jié)
?????? 關(guān)于流程引擎的腳本信息卵皂,參考用戶只能腳本一章
二秩铆、支持的腳本語(yǔ)言(Supported Script Languages):
?????? camunda支持大多是兼容JSR-223的腳本引擎實(shí)現(xiàn)。比如Groovy, JavaScript, JRuby and Jython
三灯变、腳本中的變量(Variables in Scripts):
?????? 所有的流程變量都可以在腳本任務(wù)的腳本中進(jìn)行訪問(wèn)殴玛,下面的例子,腳本變量inputArray事實(shí)上是一個(gè)流程變量:
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
也可以在腳本中設(shè)置流程變量添祸,通過(guò)變量作用接口提供的setVariable(...)方法:
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
execution.setVariable("sum", sum);
</script>
四滚粟、啟用自動(dòng)存儲(chǔ)腳本變量(Enabling auto-storing of Script Variables):
?????? 通過(guò)在流程引擎的配置上設(shè)置autoStoreScriptVariables為true。流程引擎會(huì)自動(dòng)存儲(chǔ)所有的全局腳本變量作為流程變量刃泌。這個(gè)默認(rèn)行為在Camunda BPM7.0和7.1上只支持Groovy腳本凡壤。
使用這個(gè)特性署尤,需要遵守下面兩條:
?????? 1.在流程引擎配置上設(shè)置autoStoreScriptVariables變量為true
?????? 2.腳本變量不能定義成用關(guān)鍵字def作為前綴的腳本變量。例如:def sum = 0亚侠,這個(gè)變量sum不會(huì)被作為一個(gè)流程變量存儲(chǔ)
?????? 3.這個(gè)autoStoreScriptVariables只對(duì)Groovy腳本生效曹体,其他腳本不能保證生效
注意:以下名稱是保留字,不能用作變量名:out, out:print, lang:import, context, elcontext硝烂。
五箕别、腳本結(jié)果(Script Results):
?????? 腳本任務(wù)的返回值可以被分配給之前已經(jīng)存在的或者新的流程變量,通過(guò)指定流程變量的名稱滞谢,作為腳本任務(wù)定義的camunda:resultVariable屬性的一個(gè)字面量串稀。當(dāng)腳本任務(wù)執(zhí)行時(shí),這個(gè)指定的流程變量名存在的其他的值都會(huì)被新的結(jié)果值重寫狮杨。如果不指定流程變量名母截,腳本的結(jié)果值會(huì)被忽略掉。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="juel" camunda:resultVariable="myVar">
<script>#{echo}</script>
</scriptTask>
?????? 在上面的例子中橄教,腳本執(zhí)行的結(jié)果(執(zhí)行表達(dá)式 #{echo}的結(jié)果)微酬,在腳本執(zhí)行完成后,將會(huì)被設(shè)置到名字叫myVar的流程變量中颤陶。
六颗管、多實(shí)例結(jié)果變量(Result variables and multi-instance):
?????? camunda:resultVariable屬性被用在多實(shí)例結(jié)構(gòu)中,比如多實(shí)例子流程中滓走,結(jié)果變量會(huì)被多次重寫垦江。