2

我们正在使用 bpm 对流程进行建模,并在 Spring 环境中使用 camunda 引擎执行所述 bpm。在一种情况下,我想在两个用户任务之间执行自定义 Java 代码。通过阅读大量 camunda 文档,我得出的结论是,我最适合使用服务任务概念。

我想做两件事,一是在服务任务中存储多个流程变量,二是动态定义,哪些流程变量映射到服务任务的哪个输入参数

据我所知,Camunda 提供了两种将 Java 代码与服务任务集成的方法:

1.) 声明一个实现 JavaDelegate 接口的 Spring-Bean。(该方法获取一个 DelegateExecution 作为参数)。这将允许我存储任意数量的结果变量,但我看不到定义映射过程变量-> 输入变量的选项。

2.) 声明一个可供 camunda 访问的通用 Spring bean,并定义该 bean 由系统任务执行的方法。这允许我通过 bpm-definition 指定流程变量 -> 输入变量模式,但最多存储一个结果变量。

那么,有没有办法同时实现呢?

澄清

为了阐明我的要求,有时我的系统任务可能会检测到不一致的状态(在数据库或进程变量中)。我希望任务在流程变量中存储错误代码(类似于程序“exit(1)”的错误代码),以便后续用户任务有机会纠正错误。这个错误代码也可以存储在流程变量中的固定位置,但是我希望能够将至少一个“真实结果”放在指定位置。

4

1 回答 1

2

您应该能够在使用当前执行来读取和更新变量的 Spring bean 中实现该行为。

myErrorHandler您将使用这样的服务任务连接命名的 spring bean

<serviceTask id="checkError"
             camunda:expression="#{myErrorHandler.checkError(execution)}" />

默认情况下,该execution变量在表达式中可用,并指向允许您访问当前流程变量的DelegateExecution实例。

Spring bean 的实现可能如下所示:

@Component
public class MyErrorHandler {

  /**
   * Actual error handler invoked as service
   */
  public void checkError(DelegateExecution execution) {

    execution.getVariables(); // Map<String, Object> of variables

    execution.setVariable("errorCode", 500); // update variable
  }
}
于 2013-10-15T12:09:03.067 回答