脚本任务是一个自动活动,当流程执行到脚本任务时,相关的脚本自动执行。
一、定义脚本任务
脚本任务通过指定脚本和脚本格式来定义。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
scriptFormat脚本属性的命名必须遵守Java平台的JSR-223规范。如果想要使用JSR-223脚本引擎,需要引入相关的jar包,并且使用恰当的名字(scriptFormat的名字)。 脚本的源码必须附加在script子元素的文本内容里。脚本源代码可以指定为表达式或外部资源,详细请看用户指南相关章节 关于流程引擎的脚本信息,参考用户只能脚本一章
二、支持的脚本语言(Supported Script Languages):
camunda支持大多是兼容JSR-223的脚本引擎实现。比如Groovy, JavaScript, JRuby and Jython
三、脚本中的变量(Variables in Scripts):
所有的流程变量都可以在脚本任务的脚本中进行访问,下面的例子,脚本变量inputArray事实上是一个流程变量:
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
也可以在脚本中设置流程变量,通过变量作用接口提供的setVariable(...)方法:
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
execution.setVariable("sum", sum);
</script>
四、启用自动存储脚本变量(Enabling auto-storing of Script Variables):
通过在流程引擎的配置上设置autoStoreScriptVariables为true。流程引擎会自动存储所有的全局脚本变量作为流程变量。这个默认行为在Camunda BPM7.0和7.1上只支持Groovy脚本。
使用这个特性,需要遵守下面两条: 1.在流程引擎配置上设置autoStoreScriptVariables变量为true 2.脚本变量不能定义成用关键字def作为前缀的脚本变量。例如:def sum = 0,这个变量sum不会被作为一个流程变量存储 3.这个autoStoreScriptVariables只对Groovy脚本生效,其他脚本不能保证生效 注意:以下名称是保留字,不能用作变量名:out, out:print, lang:import, context, elcontext。
五、脚本结果(Script Results):
脚本任务的返回值可以被分配给之前已经存在的或者新的流程变量,通过指定流程变量的名称,作为脚本任务定义的camunda:resultVariable属性的一个字面量。当脚本任务执行时,这个指定的流程变量名存在的其他的值都会被新的结果值重写。如果不指定流程变量名,脚本的结果值会被忽略掉。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="juel" camunda:resultVariable="myVar">
<script>#{echo}</script>
</scriptTask>
在上面的例子中,脚本执行的结果(执行表达式 #{echo}的结果),在脚本执行完成后,将会被设置到名字叫myVar的流程变量中。
六、多实例结果变量(Result variables and multi-instance):
camunda:resultVariable属性被用在多实例结构中,比如多实例子流程中,结果变量会被多次重写。