我们使用bpm对进程进行建模,并在Spring环境中使用camunda引擎执行所述bpm。在一个场景中,我想在两个用户任务之间执行自定义Java代码。阅读大部分camunda文档的结论是,我最好使用Service-Task概念。
我想做两件事,一件是使用服务任务存储多个流程变量,另一件是动态定义,哪些流程变量映射到Service-Task的哪个输入参数
据我所知,Camunda提供了两种将Java代码与服务任务集成的方法:
1。)声明实现JavaDelegate接口的Spring-Bean。 (该方法获取DelegateExecution作为参数)。这个允许我存储尽可能多的结果变量但我看不到定义映射过程变量的选项 - >输入变量。
2.)声明一个可由camunda访问的通用Spring bean,并定义由系统任务执行的bean的方法。这允许我顶部指定过程变量 - >输入变量模式通过bpm-definition但最多存储一个结果变量。
那么,有没有办法实现这两个目标?
澄清
为了澄清我的要求,有时我的系统任务可能会检测到不一致的状态(在数据库或流程变量中)。我希望任务在过程变量中存储错误代码(类似于程序“exit(1)”的错误代码),以便后续用户任务有机会纠正错误。此错误代码也可能存储在流程变量的固定位置,但我希望能够在指定位置放置至少一个“实际结果”。
答案 0 :(得分: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
}
}