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);
|
}
|
}
|