TransactionCallbacks.java

package org.darkroomlibrary.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

/**
 * Keeps non-transactional side effects outside the business commit boundary.
 */
public final class TransactionCallbacks {

    private static final Logger log = LoggerFactory.getLogger(TransactionCallbacks.class);

    private TransactionCallbacks() {
    }

    public static void afterCommit(Runnable task) {
        Runnable safeTask = () -> {
            try {
                task.run();
            } catch (RuntimeException e) {
                log.warn("提交后任务执行失败,业务事务已提交: {}", e.getMessage(), e);
            }
        };
        if (!TransactionSynchronizationManager.isActualTransactionActive()
                || !TransactionSynchronizationManager.isSynchronizationActive()) {
            safeTask.run();
            return;
        }
        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCommit() {
                safeTask.run();
            }
        });
    }
}