package com.rjyx.hdis.utils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
@Component
public class CompletableFutureUtil {
private final PlatformTransactionManager transactionManager;
public CompletableFutureUtil(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public CompletableFuture<Void> runAsync(Runnable task) {
return CompletableFuture.runAsync(() -> {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = transactionManager.getTransaction(def);
try {
task.run();
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw new RuntimeException(e);
}
});
}
public <T> CompletableFuture<T> runAsync(Supplier<T> task) {
return CompletableFuture.supplyAsync(() -> {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status = transactionManager.getTransaction(def);
try {
T result = task.get();
transactionManager.commit(status);
return result;
} catch (Exception e) {
transactionManager.rollback(status);
throw new RuntimeException(e);
}
});
}
}
@Autowired
private CompletableFutureUtil completableFutureUtil;
@Transactional(rollbackFor = Exception.class)
public void completableFutureDispose() {
try {
CompletableFuture<String> cf1 = completableFutureUtil.runAsync(() ->
);
CompletableFuture<String> cf2 = completableFutureUtil.runAsync(() ->
);
CompletableFuture<String> cf3 = completableFutureUtil.runAsync(() ->
);
CompletableFuture<String> cf4 = completableFutureUtil.runAsync(() ->
);
CompletableFuture.allOf(cf1, cf2, cf3, cf4);
} catch (Exception e) {
logger.error("执行发生未知异常: {}", e.getMessage(), e);
throw new RuntimeException("执行失败", e);
}
}