一、问题背景

在某项业务中,需要在事务完成后,写入日志到某数据库中。需要要么都成功,要么都失败,而且需要异步实现。在不考虑分布式事务框架下,如何实现这个业务功能呢?
二、实现方案
前提需要启动kafka_2.12-3.9.1内置的zookeeper和kafka。


在kafka创建好topic
kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testTopic


可以利用事务钩子函数实现异步发送,保证同时成功和失败。注册事务钩子,在事务提交或回滚后执行。
if (!TransactionSynchronizationManager.isSynchronizationActive()) {
// 调用异步方法发送日志
System.out.println("事务未开启");
// 异步发送日志(解决由于同一个类内部方法调用不会创建代理,所以aop不生效,则@Async注解无作用问题)
kafkaSender.send();
} else {
// 注册事务钩子,在事务提交或回滚后执行
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(int status) {
System.out.println("事务开启并执行完毕");
// 异步发送日志(解决由于同一个类内部方法调用不会创建代理,所以aop不生效,则@Async注解无作用问题)
kafkaSender.send();
}
});
}
1、生产者代码
KafkaController
@RestController
public class KafkaController {
@Autowired
private TestService testService;
@GetMapping("/send/{type}")
public String sendMessageToKafka(@PathVariable int type) {
if(type == 1){
// 模拟执行事务未开启的业务逻辑
testService.executeServiceNoTranscational

最低0.47元/天 解锁文章
447

被折叠的 条评论
为什么被折叠?



