Script Task 脚本任务
脚本任务是自动活动。当流程执行到达脚本任务时,执行相应的脚本。
通过指定脚本内容和脚本格式来定义脚本任务:
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="groovy">
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
</scriptTask>
scriptFormat属性的值必须是一个与JSR-223(Java平台的脚本)兼容的名称。如果你想使用一个(与JSR-223兼容的)脚本引擎,你需要在classpath中添加相应的jar,并使用适当的名称。
脚本源代码必须作为script
子元素的文本内容添加。
或者,源代码可以被指定为表达式或外部资源。更多
关于提供脚本源代码的可能方式的更多信息,请参见相应的
用户指南 的 脚本来源 章节。
支持的脚本语言
Camunda平台应该可以与大多数JSR-223兼容的脚本引擎实现协同工作。我们测试了Groovy、JavaScript、JRuby和Jython的集成。请参阅用户指南 的 第三方依赖性部分了解更多细节。
脚本中的变量
所有通过执行到达脚本任务中的流程变量都可以在脚本中使用。在下面的例子中,脚本变量inputArray
实际上是一个流程变量(一个整数的列表)。
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
</script>
也可以在脚本中设置流程变量。变量可以通过使用VariableScope
接口提供的setVariable(..)
方法来设置。
<script>
sum = 0
for ( i in inputArray ) {
sum += i
}
execution.setVariable("sum", sum);
</script>
启用自动存储脚本变量的功能
通过在流程引擎配置中设置属性autoStoreScriptVariables
为true,流程引擎将自动把所有_global_脚本变量存储为流程变量。这是Camunda平台7.0和7.1中的默认行为,但它只可靠地适用于Groovy脚本语言(更多信息请参见迁移指南中的设置自动存储脚本变量 部分)。
要使用这一功能,你必须
- 在流程引擎配置中把
autooStoreScriptVariables
设置为true
。 - 用
def
关键字声明给所有不应该被存储为脚本变量的脚本变量:def sum = 0
。在这种情况下,变量sum
将不会被存储为流程变量。
只有Groovy支持
配置标志autoStoreScriptVariables
只支持Groovy脚本任务。如果为其他脚本语言启用。
它不能保证哪些变量会被脚本引擎导出。例如
例如,Ruby根本就不会导出任何脚本变量。
注意:以下名称是保留的,不能作为变量名使用:
out
, out:print
, lang:import
, context
, elcontext
.
脚本返回结果
脚本任务的返回值可以分配给先前存在的或新的流程变量,方法是将流程变量名称作为脚本任务定义的camunda:resultVariable
属性的字面值。特定流程变量的任何现有值将被脚本执行的结果值所覆盖。当没有指定结果变量名称时,脚本的结果值会被忽略。
<scriptTask id="theScriptTask" name="Execute script" scriptFormat="juel" camunda:resultVariable="myVar">
<script>#{echo}</script>
</scriptTask>
在上面的例子中,脚本执行的结果(解析表达式#{echo}
的值)在脚本完成后被设置到名为myVar
的流程变量中。
结果变量和多实例
请注意,当你在多实例构造中使用camunda:resultVariable
时,例如在多实例子流程中,每次任务完成后,结果变量都会被覆盖,这可能会表现为随机行为。参见camunda:resultVariable了解详情。
Camunda 扩展
属性 | camunda:asyncBefore, camunda:asyncAfter, camunda:exclusive, camunda:jobPriority, camunda:resultVariable, camunda:resource |
---|---|
扩展元素 | camunda:failedJobRetryTimeCycle, camunda:inputOutput |
约束 |
The camunda:exclusive attribute is only evaluated if the attribute
camunda:asyncBefore or camunda:asyncAfter is set to true
|