如何在 Camunda JavaScript 服务任务中实例化“执行”对象?

How can I instantiate the `execution` object in a Camunda JavaScript service task?

我在 forum/documentation (like this one) 上看到很多 JavaScript 参考资料和代码片段,其中 execution 对象用于一系列有用的事情,例如如:

execution.createIncident(String incidentType, String configuration);
execution.resolveIncident(String incidentId);
execution.setVariable("name", value);

但是,我在任何地方都没有看到如何实例化 execution 对象的示例,当我尝试使用它时,我收到如下错误:

The process could not be started. :
Cannot instantiate process definition Finswitch_Tx:14:42ef803b-67df-11e8-a127-0242ac11001b: Unable to 
evaluate script: ReferenceError: "execution" is not defined in <eval> at line number 7

请举例说明如何实例化对该对象的访问?

你从camunda获得的delegateExecution/delegateTask对象是camunda根据当前执行状态创建的非常复杂的上下文挂钩,并将其交给挂钩(监听器和委托)。 你不能自己创建它。 如果您需要访问它,请将您的代码放在 Task/ExecutionListener 或委托中,这样您就可以自动访问它。

所以经过一些 help on the Camunda forum.

更全面的回答

根据 this documentation当前作用域中可用的所有流程变量都可以按名称用于脚本,还有一些特殊变量:executiontaskconnector.

文档中不清楚的是,连接器的输出变量中的脚本在子(连接器)作用域中运行,所以虽然connector 对象可用,execution 不可用。可以像这样访问执行实例上的一些功能:

var execution = connector.getParentVariableScope();
var activityId = execution.getCurrentActivityId();

但是,我看到返回的对象实际上是一个 AbstractVariableScope,所以我不确定它能用到什么程度。

同理,在一个TaskListener的脚本里面,有任务实例可用,对应DelegateTask接口。这里的 execution 实例可以按如下方式访问:

task.execution.getCurrentActivityId();

Execution Listener 中,可以直接访问 execution 实例。

execution.setVariable("testVar", true);