【问题标题】:Camunda/Activity Service TasksCamunda/活动服务任务
【发布时间】:2013-10-19 14:43:06
【问题描述】:

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

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

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

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

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

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

澄清

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

【问题讨论】:

  • 不太确定您想要达到什么目标。您想从服务任务实现中创建/更新多个流程变量吗?输入映射应该从哪里来?

标签: java workflow-activity camunda


【解决方案1】:

您应该能够在使用当前执行来读取和更新变量的 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
  }
}

【讨论】:

  • 所以“执行”是一个默认变量,它始终存在于 ProcessVariables 中?
  • 刚刚检查过:是的。非常感谢!
  • 是的,它默认可用。我更新了我的答案以反映这一点。
  • 非常感谢您的回答。是否有关于系统任务可用的隐式变量的概述?我发现,它不仅是 DelegateExecution,而且实际上是 ActivityExecution(这更有用),我想知道这是幸运的意外还是故意的。
  • 查看service task documentation 了解所有选项。引擎暴露的接口确实是DelegateExecution。除非您知道自己在做什么,否则您应该使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多