RabbitMQ整合Spring Booot【生产者事务确认机制】

RabbitMQ消息队列实战
本文详细介绍了如何使用RabbitMQ实现消息队列的基本操作,包括创建队列、发送消息、接收消息以及通过事务保证消息的可靠投递。通过具体的Java代码示例,展示了生产者和消费者的交互过程。
package com.toov5.amqp;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.toov5.utils.MQConnectionUtils;

public class Producer {
    // 队列名称
    private static final String UEUE_NAME = "test_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
        // 创建Channel
        Channel channel = connection.createChannel();
        // 创建队列
        channel.queueDeclare(UEUE_NAME, false, false, false, null);
        channel.basicQos(1); // 保证 取一个消费
            try {
                channel.txSelect();    //开启事务
                // 创建message
                String msg = "toov5_message";
                System.out.println("生产者投递消息" + msg );
                // 生产者发送消息
                channel.basicPublish("", UEUE_NAME, null, msg.getBytes());
                int i = 1/0;
                channel.txCommit();   //提交事务
            } catch (Exception e) {
                System.out.println("生产者消息事务已经回滚");
                channel.txRollback();   //回滚事务
            }finally {
                // 关闭通道和连接
                channel.close();
                connection.close();

            }            
            
        }
    
    }

consumer:

package com.toov5.amqp;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.toov5.utils.MQConnectionUtils;

public class Consumer1 {
  
     //队列名称
        private static final String QUEUE_NAME = "test_queue";
        
        public static void main(String[] args) throws IOException, TimeoutException {
            System.out.println("消费者启动..........1");
            //创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
           //创建Channel
            final Channel channel = connection.createChannel();
            // 消费者关联队列
             channel.queueDeclare(QUEUE_NAME, false, false, false, null);
             channel.basicQos(1);
              DefaultConsumer defaultConsumerr = new DefaultConsumer(channel) {
                  //监听获取消息
                    @Override
                    public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                            byte[] body) throws IOException {
                        String msg =new String(body,"UTF-8");
                        System.out.println("消费者获取生产者消息:"+msg);
                        try {
                            //模拟应答等待时间
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            
                        }finally {
                           channel.basicAck(envelope.getDeliveryTag(), false);  //手动应答 告诉消息队列服务器 消费成功
                        }
                    }
              };
            //牵手模式设置  默认自动应答模式  true:自动应答模式  
              channel.basicConsume(QUEUE_NAME, false, defaultConsumerr);//    fanse手动应答          

        }
}

结果:

上面可以做个AOP~~

 可以参考下 Confirm模式

<think>首先,用户的问题是关于在Spring MVC应用中通过XML配置整合RabbitMQ,并实现生产者确认机制。具体来说,用户问的是“spring mvc rabbitmq 配置 生产者确认机制 xml”。 我需要回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 用户提供了几个引用: - 引用[1]:关于RabbitMQ配置文件的示例。 - 引用[2]:关于Spring MVC整合RabbitMQ生产者代码。 - 引用[3]:关于Spring中配置多个RabbitMQ生产者类。 - 引用[4]:关于RabbitMQ基础参数配置。 - 引用[5]:关于Spring集成RabbitMQ的配置文件解读。 这些引用似乎与用户的问题相关,但用户的问题是针对生产者确认机制的具体XML配置。我需要基于这些引用和一般知识来构建回答。 关键点: - 生产者确认机制(Producer Acknowledgements)是RabbitMQ的一个特性,用于确保消息被成功投递到broker。 - 在Spring AMQP中,可以通过配置来实现这个机制。 - 用户指定了XML配置,所以我需要提供XML配置示例。 步骤: 1. **理解生产者确认机制**:在RabbitMQ中,生产者确认机制允许生产者知道消息是否被broker接收。这可以通过事务或Publisher Confirms来实现。Publisher Confirms更高效,推荐使用。 2. **Spring AMQP支持**:Spring AMQP提供了RabbitTemplate来发送消息,并支持确认机制。 3. **XML配置**:用户要求XML配置,所以我需要提供XML配置文件的示例。 从引用中提取相关信息: - 引用[1]和[4]:提供了RabbitMQ连接属性的配置,如host, port, username, password。 - 引用[2]和[3]:展示了生产者类的代码,使用RabbitTemplate。 - 引用[5]:提到了Spring集成RabbitMQ的配置文件,但没有详细说明生产者确认机制。 我需要补充知识: - 在Spring AMQP中,启用Publisher Confirms需要在RabbitTemplate上设置publisherConfirms为true。 - 还需要实现一个ConfirmCallback来处理确认。 在XML配置中,这可以通过定义bean来实现。 结构我的回答: 1. **介绍**:简要解释生产者确认机制。 2. **步骤**:逐步指导如何配置。 - 配置RabbitMQ连接工厂。 - 配置RabbitTemplate并启用publisherConfirms。 - 定义ConfirmCallback。 3. **XML配置示例**:提供完整的XML配置代码。 4. **生产者代码**:展示如何在生产者使用。 5. **相关问题**:生成相关问题。 确保使用中文回答。 引用处理:在回答中,如果我引用或基于提供的引用,需要在末尾添加引用标识。例如,如果我用到了引用[1]中的配置,就添加[^1]。 用户引用似乎不是直接相关,但我会尝试整合。 最终回答结构: - 开头:解释问题。 - 主体:分步XML配置。 - 结尾:生成相关问题。</think>### Spring MVC中RabbitMQ生产者确认机制的XML配置指南 在Spring MVC应用中整合RabbitMQ时,生产者确认机制(Producer Acknowledgements)是确保消息可靠投递的关键特性。它通过RabbitMQ的Publisher Confirms机制实现:生产者发送消息后,broker会返回一个确认(ack)或未确认(nack),从而避免消息丢失。在Spring AMQP中,可以通过XML配置RabbitTemplate来启用此机制。下面我将逐步指导您完成配置,确保高效可靠的消息处理。 #### 1. **理解生产者确认机制** - **Publisher Confirms**:RabbitMQ的高效确认机制,比事务更轻量级。当消息被broker接收时,会触发ConfirmCallback回调。 - **核心组件**: - `CachingConnectionFactory`:配置RabbitMQ连接参数(如host、port)。 - `RabbitTemplate`:发送消息的模板类,需设置`publisherConfirms="true"`。 - `ConfirmCallback`:接口实现,用于处理确认结果(例如,记录日志或重试)。 - 性能考虑:启用确认机制会增加少量开销,但提升了可靠性,适用于金融交易或订单处理等场景[^1]。 #### 2. **XML配置步骤** 以下是一个完整的`rabbitmq-context.xml`配置文件示例。您需要将此文件放置在Spring MVC的`src/main/resources`目录下,并在`web.xml`中加载为Spring上下文。 ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit.xsd"> <!-- 步骤1: 加载RabbitMQ连接参数(参考引用[1][4]) --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:properties/rabbitmq.properties"/> </bean> <!-- 步骤2: 配置连接工厂 --> <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}" password="${rabbitmq.password}" virtual-host="${rabbitmq.virtual-host}" publisher-confirms="true" <!-- 启用生产者确认 --> publisher-returns="true"/> <!-- 可选: 启用消息返回机制 --> <!-- 步骤3: 定义RabbitTemplate并启用确认机制 --> <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="myExchange" <!-- 指定默认交换机 --> routing-key="myRouteKey" <!-- 指定默认路由键 --> confirm-callback="confirmCallback" <!-- 绑定确认回调 --> mandatory="true"/> <!-- 确保消息可路由 --> <!-- 步骤4: 实现ConfirmCallback接口 --> <bean id="confirmCallback" class="com.example.RmqConfirmCallback"/> </beans> ``` #### 3. **关键配置详解** - **连接参数**:通过`rabbitmq.properties`文件定义(如引用[1][4]所示),包含host、port等。示例文件内容: ``` rabbitmq.host=192.168.220.12 rabbitmq.port=5672 rabbitmq.username=lxs rabbitmq.password=lxs rabbitmq.virtual-host=/xzk ``` - **RabbitTemplate配置**: - `publisher-confirms="true"`:启用Publisher Confirms(必须设置)。 - `confirm-callback`:指定回调Bean,处理ack/nack结果。 - **ConfirmCallback实现**:创建一个Java类处理确认结果。例如: ```java package com.example; import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback; import org.springframework.amqp.rabbit.support.CorrelationData; public class RmqConfirmCallback implements ConfirmCallback { @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { if (ack) { System.out.println("消息投递成功: " + correlationData.getId()); } else { System.out.println("消息投递失败: " + cause); // 记录日志或重试 } } } ``` - **生产者代码**:在Spring MVC的Controller或Service中注入RabbitTemplate(如引用[2][3]所示)。示例: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class RmqProducer { @Autowired private RabbitTemplate rabbitTemplate; public void sendMessage(String message) { rabbitTemplate.convertAndSend("myExchange", "myRouteKey", message, new CorrelationData("msg123")); // CorrelationData用于关联确认回调 } } ``` #### 4. **验证与优化建议** - **测试确认机制**:发送消息后,检查控制台输出。如果出现nack,需排查网络或broker问题。 - **错误处理**:在`ConfirmCallback`中添加重试逻辑(例如,使用Spring Retry)。 - **性能影响**:确认机制会增加延迟,建议在高吞吐场景下结合批处理使用[^5]。 - **依赖管理**:确保添加Spring AMQP和RabbitMQ客户端依赖(参考引用[5]),在`pom.xml`中: ```xml <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>2.3.0</version> <!-- 推荐版本 --> </dependency> ``` #### 5. **常见问题** - **为何未触发回调?** 检查`publisher-confirms="true"`是否设置,且`CorrelationData`不为null。 - **XML配置错误**:确保schema定义正确,避免命名空间错误。 - **多broker支持**:如需连接多个RabbitMQ实例,定义多个`connection-factory`和`rabbitTemplate`(参考引用[3])。 通过以上配置,您的Spring MVC应用将实现可靠的消息投递。生产者确认机制能显著提升系统鲁棒性,特别适合电商或实时数据处理场景[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值