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

目录: