用于完成 camunda 用户任务和更新外部数据库的数据一致性

Data Coherence for completing camunda user task and updating external DB

我们在我们的应用程序中使用 camunda 作为 REST 服务。 为了在我们的应用程序中完成用户任务,我们必须执行 2 个操作:
1. 向本地数据库写入数据
2. camunda rest完成任务API

但是这个操作不是事务性的。这对我们来说是个问题。

此代码代码不是事务性的:

completeUserTask(String taskId, SpecificTaskData userData) {
     dao.update(userData)
     camundaRestApi.completeUserTask(taskId)
}

我看到两个可用的解决方案。两者都将 camunda 用户任务拆分为 2 个节点:

但我不喜欢为每个用户任务创建服务任务或消息接收器的想法。
我认为它使图表不清晰(更不合理)。
你怎么看待这个问题?谢谢。

我的建议可能为时已晚:-)

我们也遇到了如何将两个操作(写入业务数据和完成task/sending消息)放在同一个事务中的问题。

我们的解决方案是这样组织方法:

@Transactional
void correlate(String message, String businessKey, DataObject dataObject) {
        dataRepository.update(dataObject);
        runtimeService.correlateMessage(messageCode, businessKey);        
}

当然,您可以使用任何其他触发器来继续流程(complete/submit 用户任务)。

另一种方法是创建执行侦听器,它可以从流程上下文中获取数据并将其放入您需要的任何地方(DAO、服务、事件总线等)。此外,通过 Java 配置,您可以默认为任何类型的 activity 添加此类侦听器(无需在 Modeler 中指定):

    public class AddSendEventListenerToBpmnParseListener implements BpmnParseListener {
    
      @Override   public void parseProcess(Element processElement, ProcessDefinitionEntity processDefinition) {
        processDefinition.addBuiltInListener(PvmEvent.EVENTNAME_START, new SendEventListener());
        processDefinition.addBuiltInListener(PvmEvent.EVENTNAME_END, new SendEventListener());   }
    
      @Override   public void parseIntermediateThrowEvent(Element intermediateEventElement, ScopeImpl scope, ActivityImpl activity) {
        activity.addBuiltInListener(PvmEvent.EVENTNAME_START, new SendEventListener());   }
    
      @Override   public void parseStartEvent(Element startEventElement, ScopeImpl scope, ActivityImpl startEventActivity) {   }
    
    // other methods omitted 

}