RocketMQ发送事务消息的所有方法以及代码示例

#TOC

一、使用RocketMQTemplate发送事务消息

首先我们要确定发送什么样的消息,使用RocketMQTemplate发事务消息时程序会自动进入事务监听器类中,所以我们确定发什么样的消息才能在事务监听器中决定是否提交事务:

public class TransactionMQProducerTest {
    public static void main(String[] args) throws MQClientException, MQBrokerException, RemotingException, InterruptedException {
    	Message<String> sendMessage = MessageBuilder.withPayload("这里设置消息体")
                .setHeader("消息的属性的key", "消息的属性的值")
                // 想发送带key的消息,请求头的键必须写成KEYS
                .setHeader("KEYS", "消息的key的值")
                .build();
    	List<String> exampleObj = Arrays.asList("a", "b", "c");
        TransactionSendResult result = rocketMQTemplate.sendMessageInTransaction("topicA:tagA", sendMessage, exampleObj);
        System.out.println(result);
    }
}

然后就是实现事件监听器类,这个类需要实现 RocketMQLocalTransactionListener接口并加上 @Component
@RocketMQTransactionListener 注解:

@Component
@RocketMQTransactionListener
public class TransactionListenerImpl implements RocketMQLocalTransactionListener {
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(org.springframework.messaging.Message message, Object object) {
            System.out.println(message.getTags());
            List<String> exampleObj = (List<String>) object;
            String str = exampleObj.get(0);
            System.out.println(str);
            // 提交事务,此次发送成功
            return RocketMQLocalTransactionState.COMMIT;

            // 回滚事务,此次发送取消
//          return RocketMQLocalTransactionState.ROLLBACK;

            // 事务回查,调用checkLocalTransaction函数
//          return RocketMQLocalTransactionState.UNKNOW;
        }
    }

    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(org.springframework.messaging.Message message) {
    		System.out.println("事务回查");
       		return RocketMQLocalTransactionState.COMMIT;
    }
}

相对于发送普通消息,发送事务消息要实现 RocketMQLocalTransactionListener接口并加上 @Component
@RocketMQTransactionListener 注解。我们调用public TransactionSendResult sendMessageInTransaction(String destination, Message<?> message, Object arg) throws MessagingException; 发送事务消息后会回调到executeLocalTransaction()方法中,sendMessageInTransaction()中的msg和object参数会传入到executeLocalTransaction()方法中的message和object参数中,在executeLocalTransaction()方法中我们根据自己的业务需求来返回RocketMQLocalTransactionState.COMMIT(提交事务,此次发送成功)RocketMQLocalTransactionState.UNKNOW(事务回查,进入到checkLocalTransaction函数中)RocketMQLocalTransactionState.ROLLBACK(回滚事务,此次发送取消)三种状态中的一个,在checkLocalTransaction()方法中根据业务需求决定是否提交。

二、使用TransactionMQProducer发送事务消息

public class TransactionMQProducerTest {
    public static void main(String[] args) throws MQClientException, MQBrokerException, RemotingException, InterruptedException {
        TransactionMQProducer producer = new TransactionMQProducer("命名空间", "生产者组",
                new AclClientRPCHook(new SessionCredentials("用户名","密码")),
                true, "trace-topic");
        producer.setNamesrvAddr("nameServer集群IP");
        // 设置事务监听器
        producer.setTransactionListener(new TransactionListener() {
            @Override
            public LocalTransactionState executeLocalTransaction(Message message, Object object) {
                System.out.println(message.getTags());
                List<String> exampleObj = (List<String>) object;
                String str = exampleObj.get(0);
                System.out.println(str);
                // 提交事务,此次发送成功
                return LocalTransactionState.COMMIT_MESSAGE;

                // 回滚事务,此次发送取消
//                return LocalTransactionState.ROLLBACK_MESSAGE;

                // 事务回查,进入到checkLocalTransaction函数中
//                return LocalTransactionState.UNKNOW;
            }
            
            // executeLocalTransaction()返回LocalTransactionState.UNKNOW的时候就会进入到此方法中
            @Override
            public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
                System.out.println("事务回查");
                return LocalTransactionState.COMMIT_MESSAGE;
            }
        });
        producer.start();
        Message sendMessage = new Message("topicA", "tagA", ("这里设置消息体").getBytes(StandardCharsets.UTF_8));
        sendMessage.putUserProperty("消息的属性的键", "消息的属性的值");
        sendMessage.setKeys("消息的key");
        List<String> exampleObj = Arrays.asList("a", "b", "c");
		TransactionSendResult result = producer.sendMessageInTransaction(sendMessage, exampleObj);
        System.out.println(result);
        producer.shutdown();
    }
}

相对于发送普通消息,发送事务消息要设置事务监听器(即实现TransactionListener接口,重写executeLocalTransaction()和checkLocalTransaction()方法)。我们调用public TransactionSendResult sendMessageInTransaction(Message msg, Object object) throws MQClientException; 发送事务消息后会回调到executeLocalTransaction()方法中,sendMessageInTransaction()中的msg和object参数会传入到executeLocalTransaction()方法中的message和object参数中,在executeLocalTransaction()方法中我们根据自己的业务需求来返回LocalTransactionState.COMMIT_MESSAGE(提交事务,此次发送成功)LocalTransactionState.UNKNOW(事务回查,进入到checkLocalTransaction函数中)LocalTransactionState.ROLLBACK_MESSAGE(回滚事务,此次发送取消)三种状态中的一个,在checkLocalTransaction()方法中根据业务需求决定是否提交。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catdrinkcola

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值