开门见山,直接上代码演示!
事务内嵌了异步
/**
* Transaction embedded with async
*/
@Service
@Transactional(readOnly = true)
public class NormalService {
@Autowired
FooService fooService;
@Autowired
BarService barService;
@Autowired
TransactionSyncHandler transactionSyncHandler;
@Transactional(readOnly = false, rollbackFor = Exception.class)
public void foo() throws Exception {
// sync method
fooService.sync();
final OrderID finalOrderID = new OrderID("123");
transactionSyncHandler.handle(() -> {
// async method
barService.async(finalOrderID);
});
}
}
含有异步方法的服务
/**
* This service contains async method
*/
@Component
public class BarService {
/**
* async method
*/
@Async
public void async(OrderID orderID) throws Exception {
// send message
}
}
自定义事务同步处理器
/**
* Self defined transaction sync handler
*/
@Slf4j
@Component
public class TransactionSyncHandler {
public void handle(Runnable runnable) {
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
try {
runnable.run();
} catch (Exception e) {
log.error(Throwables.getStackTraceAsString(e));
}
}
});
} else {
runnable.run();
}
}
}