seata事务集成kafka

seata事务或本地事务,完成commit后,发送kafka消息;如果事务回滚,不发送消息。

方法可以加@Transactional本地事务注解,也可以加@GlobalTransactional全局事务注解。

发送消息的类:

java 复制代码
@Service
public class MessageSendAfterCommit {
    @Autowired
    ApplicationEventPublisher eventPublisher;
    @Autowired
    private MessageQueueService messageQueueService;

    public void send(String message) {
        GlobalTransaction globalTransaction = GlobalTransactionContext.getCurrent();
        if(!isSeataTransaction()) {
            // 不是seata事务
            eventPublisher.publishEvent(message);
        } else {
            // seata事务
            MessageTransactionHook messageTransactionHook = new MessageTransactionHook(message);
            TransactionHookManager.registerHook(messageTransactionHook);
        }

    }

    private boolean isSeataTransaction() {
        return StrUtil.isNotBlank(RootContext.getXID());
    }

    class MessageTransactionHook extends TransactionHookAdapter {
        private String messageContent;
        public MessageTransactionHook(String message) {
            this.messageContent = message;
        }
        @Override
        public void afterCommit() {
            System.out.println("This is Kevin");
            // 这里发送消息。
        }
    }
}

如果是本地事务,需要发送spring事件,由监听器监听后发消息:

java 复制代码
@Component
public class TransactionEventListeners {
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void kevinTestInfoReq(String req) {
        System.out.println("kevin Zhang Transaction");
        // 发送消息。
    }
}
相关推荐
太理摆烂哥1 小时前
MySQL数据库基础
数据库·mysql
wuhuhuan1 小时前
JMeter 连接数据库并取值(JDBC 实战)
数据库·jmeter
做个文艺程序员2 小时前
MQ第03篇:RabbitMQ进阶实战:Topic路由+死信队列+延迟消息,SaaS订单超时取消完整方案
分布式·消息队列·rabbitmq·死信队列·延迟队列
小羊没烦恼!2 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
Rain的Java大神之路2 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
风花一世月2 小时前
[特殊字符] 我把一套分布式消防方案做成了能跑的 3D 沙盘(三架无人机共用一根水带,在线直接玩)
分布式·3d·ai·无人机
码途行者2 小时前
缓存一致性难题:Redis 和数据库如何做到数据一致?
数据库·redis
SelectDB2 小时前
Doris VARIANT 速查:类型映射、建表写法、索引配置与常见注意点
大数据·数据库·数据分析
l1t3 小时前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
夜雪一千3 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql