刘光辉
5 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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);
    }
}