RocketMq(3)-发送带有事务的消息

RocketMq支持事务性的消息

RocketMq支持传输带有事务的消息,可以用来保持数据的最终一致性。下面我来简单的实现一个带有事务的消息

生产者端的代码
  1. 需要写事务检查的Listener,自定义一个类,实现TransactionCheckListener(rocketMq3.0.8版本以前)

    public LocalTransactionState checkLocalTransactionState(MessageExt messageExt) {
    //可以查看messageExt里面的body是否存在,来判断事务的状态
    return LocalTransactionState.COMMIT_MESSAGE;
    }
    
  2. 然后写本地操作的事务,我们需要实现TransactionExuctor的接口,

    public LocalTransactionState executeLocalTransactionBranch(Message message, Object o) {
    System.out.println(“本地事务”);
    //在这里进行数据库的操作,
    return LocalTransactionState.COMMIT_MESSAGE;
    }

  3. 生产者的代码

    TransactionCheckListener transactionCheckListener=new MyTranscationCheckListener();
    TransactionMQProducer producer=new TransactionMQProducer(“transaction”);
    producer.setNamesrvAddr(“47.106.132.60:9876”);
    producer.setTransactionCheckListener(transactionCheckListener);
    producer.start();
    MyLocalTranscationExuctor transcationExuctor=new MyLocalTranscationExuctor();
    Message message=new Message(“Topic_Trans”,”MyTags”,”事务消息”.getBytes());
    producer.sendMessageInTransaction(message,transcationExuctor,null);
    producer.shutdown();

如何处理在RocketMq3.0.8版本后的消息检查

我们需要自己去解决消息的check listener回查机制,我们可以在生产者这端执行本地事务操作时,我们可以把当前消息存在另外一张表中,最好每条信息都需要一个Id,然后在这端另起一个任务或者线程来取出发送确认消息失败的消息发送给消费者。然后消费者这段需要一张表来存储已经成功解决的消息列表,然后起一个任务,来取出一段时间之内已成功消费的信息,然后消费者那端进行修改表中的消息状态码。这样就会解决确认消息失败的原因。其实这个也可以用来实现不支持事务消息的消息队列实现分布式事务的最终一致性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值