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

本文介绍了如何使用RocketMQTemplate和TransactionMQProducer发送事务消息,包括设置事务监听器,执行和检查本地事务状态,以及在不同状态下的事务处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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()方法中根据业务需求决定是否提交。

<think>好的,我现在要帮用户找RocketMQ发送消息的Producer示例代码。首先,我需要回顾用户提供的引用内容,看看里面有没有相关的代码示例。用户给出的引用1、2、4中都有Java代码的例子,特别是引用2中的代码比较详细。 用户的需求是查找RocketMQ发送消息示例代码,所以需要确保提供的代码是正确且完整的。我需要检查这些引用中的代码是否有共同的步骤,比如设置NameServer地址、启动Producer、构造消息发送消息以及关闭Producer。引用1中的代码虽然简单,但可能不够详细;引用2的示例更完整,包括了初始化、发送和关闭的步骤,还提到了消息的tag和key,这些可能对用户有帮助。 接下来,我需要确保代码符合最佳实践,例如Producer实例应该是单例的,整个生命周期只初始化一次。引用2中的注释提到“整个应用生命周期内只需要初始化1次”,这点很重要,应该在回答中强调。 另外,用户可能关心异常处理和参数配置,比如重试次数、线程池设置等。引用3和4提到了一些配置参数,比如checkThreadPoolMinSize和发送失败重试次数,这些可以作为补充信息添加到回答中,帮助用户优化代码。 需要注意的是,用户提供的引用中有不同的ProducerGroupName和topic名称,需要统一示例代码中的这些值,避免混淆。例如,使用一致的Producer组名和topic,确保代码可以直接运行。 最后,要组织回答结构,先给出基本示例代码,再分步骤解释每个部分的作用,然后补充注意事项和优化建议。这样用户既能快速上手,又能了解背后的原理和最佳实践。同时,根据用户要求生成相关问题,这些问题应该围绕Producer的使用、配置和优化展开,帮助用户进一步学习。</think>### RocketMQ Producer发送消息示例代码及解析 以下是Java语言编写的RocketMQ Producer完整示例代码(基于5.x版本): ```java import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.client.producer.SendResult; public class SimpleProducer { public static void main(String[] args) throws Exception { // 1. 创建生产者实例(需指定生产者组) DefaultMQProducer producer = new DefaultMQProducer("producer_group_demo"); // 2. 配置NameServer地址(集群环境用分号分隔) producer.setNamesrvAddr("localhost:9876"); // 3. 设置消息发送失败重试次数(默认2次) producer.setRetryTimesWhenSendFailed(3); // 4. 启动生产者实例 producer.start(); // 5. 构造消息(参数顺序:topic, tag, key, body) Message msg = new Message( "test_topic", // 消息主题 "TagA", // 消息标签(用于过滤) "Order_20230720_001", // 业务唯一键(可用于去重) "Hello RocketMQ".getBytes() // 消息体 ); // 6. 发送同步消息 SendResult sendResult = producer.send(msg); System.out.printf("发送结果:%s%n", sendResult); // 7. 关闭生产者(释放资源) producer.shutdown(); } } ``` ### 关键步骤说明 1. **生产者组配置** `DefaultMQProducer("producer_group_demo")`定义生产者组,用于事务消息和故障转移[^4] 2. **NameServer地址设置** 生产者通过`setNamesrvAddr()`连接NameServer获取路由信息,实际生产环境建议配置多个地址[^2] 3. **消息构造参数说明** - Topic:消息分类的第一级标识 - Tag:消息过滤的二级标识(可为null) - Key:建议设置业务唯一标识,支持消息查询和去重 - Body:实际消息内容(建议不超过4MB) 4. **发送模式选择** 示例使用同步发送(阻塞等待结果),另有异步发送和单向发送模式可选 ### 最佳实践建议 1. **生产者实例复用** Producer应保持单例,避免重复创建销毁(每个进程建议只创建1个Producer实例)[^2] 2. **异常处理增强** 建议添加try-catch块处理MQClientException和RemotingException等异常 3. **性能优化配置** ```java // 设置压缩阈值(默认4KB) producer.setCompressMsgBodyOverHowmuch(4096); // 设置发送超时时间(默认3秒) producer.setSendMsgTimeout(5000); ``` ### 相关知识点延伸 - 事务消息需使用`TransactionMQProducer`类[^3] - 消息发送采用轮询队列机制实现负载均衡 - 生产环境建议开启ACL认证和TLS加密
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

catdrinkcola

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

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

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

打赏作者

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

抵扣说明:

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

余额充值