package com.yunhai.flowcenter.engine; import com.yunhai.flowcenter.entity.FlwRouteLog; import com.yunhai.flowcenter.repository.FlwRouteLogRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; /** * 路由留痕落库(REQUIRES_NEW,与回调 CallbackLogStore 同纪律):判断调用是真实外部副作用, * 留痕不随外层事务回滚消失——挂起重跑失败(reroute 抛业务错回滚办件推进)时失败行仍保留; * attempt 在同一新事务里"查最大+1"再落行,避免并发双判撞号。 */ @Service @RequiredArgsConstructor public class RouteLogStore { private final FlwRouteLogRepository routeLogRepository; /** 落一行留痕并提交(独立事务),返回带 attempt 的落库行 */ @Transactional(propagation = Propagation.REQUIRES_NEW) public FlwRouteLog append(FlwRouteLog row) { row.setAttempt(routeLogRepository.maxAttempt(row.getInstanceId(), row.getNodeId()) + 1); row.setDecideTime(LocalDateTime.now()); return routeLogRepository.save(row); } }