package jnpf.flowable.service; import com.baomidou.dynamic.datasource.tx.TransactionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.support.TransactionSynchronization; /** Only newly started DMS instances; native dynamic transaction owns the callback lifetime. */ public final class DmsLifecycleEngineCompensation implements TransactionSynchronization { private static final Logger LOG=LoggerFactory.getLogger(DmsLifecycleEngineCompensation.class); private final String instanceId; @FunctionalInterface public interface Deletion { void run() throws Exception; } private final Deletion deletion; private boolean deleted; private DmsLifecycleEngineCompensation(String instanceId,Deletion deletion) { this.instanceId=instanceId;this.deletion=deletion; } public static DmsLifecycleEngineCompensation register(String instanceId,Deletion deletion) { if(TransactionContext.getXID()==null) throw new IllegalStateException("DMS 引擎补偿必须绑定原生动态事务"); var callback=new DmsLifecycleEngineCompensation(instanceId,deletion); TransactionContext.registerSynchronization(callback); return callback; } /** Immediate failure and outer rollback share one receipt; failed deletion remains retryable. */ public void compensate(Throwable original) { if(deleted) return; try { deletion.run();deleted=true; } catch(Exception failure) { if(original!=null && original!=failure) original.addSuppressed(failure); LOG.error("DMS lifecycle engine compensation failed, instanceId={}",instanceId,failure); } } @Override public void afterCompletion(int status) { if(status==STATUS_ROLLED_BACK) compensate(null); } }