1、描述
脚本任务是一个自动活动。当进程执行到达脚本任务时,执行相应的脚本。
2、图形表示法
脚本任务可视化为典型的BPMN 2.0任务(圆角矩形),在矩形的左上角有一个小脚本图标。
3、XML表示
脚本任务是通过指定脚本和scriptFormat来定义的。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
scriptFormat属性的值必须是与JSR-223(Java平台的脚本)兼容的名称。默认情况下,JavaScript包含在每个JDK中,因此不需要任何额外的JAR文件。如果您想使用另一个(JSR-223兼容)脚本引擎,将相应的JAR添加到类路径并使用适当的名称就足够了。例如,Flowable单元测试经常使用Groovy,因为它的语法与Java类似。
请注意,Groovy脚本引擎与groovy-all jar捆绑在一起。在Groovy 2.0之前,脚本引擎是常规Groovy JAR的一部分。因此,现在必须添加以下依赖项:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.x.x<version>
</dependency>
4、脚本中的变量
所有可通过脚本任务中执行的进程访问的进程变量都可以在脚本中使用。在这个例子中,脚本变量“inputArray”实际上是一个过程变量(一个整数数组)。
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
也可以通过调用execution.setVariable(“variableName”,variableValue)来设置脚本中的流程变量。默认情况下,不会自动存储变量(注意:在一些较旧的版本中是这种情况!)。通过设置to 的属性,可以自动存储脚本中定义的任何变量(例如,上面的示例中的和)。但是,最好的做法是不要这样做,并使用显式的execution.setVariable()调用,就像JDK的一些最新版本一样,自动存储变量不适用于某些脚本语言。看到这个链接了解更多细节。autoStoreVariablesscriptTasktrue
<scriptTask id="script" scriptFormat="JavaScript" flowable:autoStoreVariables="false">
此参数的默认值是false,这意味着如果脚本任务定义中省略了参数,则所有声明的变量将仅在脚本持续时间内存在。
以下是如何在脚本中设置变量的示例:
<script>
def scriptVar = "test123"
execution.setVariable("myVar", scriptVar)
</script>
注意:以下名称是保留的,不能用作变量名称:out,out:print,lang:import,context,elcontext。
5、脚本结果
通过将流程变量名称指定为脚本任务定义的“flowable:resultVariable”属性的文字值,可以将脚本任务的返回值分配给已经存在的或新的流程
变量。脚本执行的结果值将覆盖特定过程变量的任何现有值。当未指定结果变量名称时,脚本结果值将被忽略。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="juel" flowable:resultVariable="myVar">
<script>#{echo}</script>
</scriptTask>
在上面的例子中,在脚本完成之后,脚本执行的结果(解析表达式’#{echo}'的值)被设置为名为’myVar’的过程变量。
6、安全
使用JavaScript作为脚本语言来使用安全脚本也是可能的。请参阅安全脚本部分。