我的建议可能为时已晚 :-)
我们还遇到了如何将两个操作(写入业务数据和完成任务/发送消息)放在同一个事务中的问题。
我们的解决方案是这样组织方法:
@Transactional
void correlate(String message, String businessKey, DataObject dataObject) {
dataRepository.update(dataObject);
runtimeService.correlateMessage(messageCode, businessKey);
}
当然,您可以使用任何其他触发器来继续流程(完成/提交用户任务)。
另一种方法是创建执行侦听器,它可以从流程上下文中获取数据并将其放入您需要的任何位置(DAO、服务、事件总线等)。此外,通过 Java Config,您可以默认为任何类型的活动添加此类侦听器(无需在 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
}