RabbitMQ消费client注解模式 @RabbitListener自动创建队列

@Component
@Slf4j
public class RabbitMqConsumer {

    @Autowired
    DingdingUtil dingdingUtil;

    @RabbitHandler
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue("my_queue"),
                    exchange = @Exchange(value = "my_exchange", type = ExchangeTypes.FANOUT)
            ))
    public void processCreate(String message) {
        log.info("------------------Received: " + message + "   ----------------------------------------------------------------------");

    }


}

必须有以下配置类,否则无法自动创建队列

@Configuration
@EnableRabbit
public class RabbitConfig {

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        // 服务启动时候开启自动启动
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }

}
<think> 我们正在使用Spring Boot整合RabbitMQ,需要配置一个@RabbitListener,指定队列名称为"order_queue",并发线程数范围为5到10,并且采用手动确认模式(MANUAL)。根据引用[2]和引用[5]中的配置示例,我们可以这样实现: ### 配置@RabbitListener的步骤 #### 1. 在配置文件中设置RabbitMQ连接信息 首先,确保在`application.yml`(或`application.properties`)中配置了RabbitMQ的连接信息,以及监听器的相关配置(如预取值等),但注意,`concurrency`和`ackMode`通常在注解中直接设置,而不是在配置文件中。不过,我们可以参考引用[5]中的一些全局配置。 ```yaml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest listener: type: simple # 使用SimpleMessageListenerContainer # 注意:这里不要设置ack-mode,因为我们要在注解中指定为MANUAL ``` #### 2. 创建消费者类并添加@RabbitListener消费者方法上使用`@RabbitListener`注解,并指定`queues`,`concurrency`和`ackMode`属性。 ```java import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class OrderMessageListener { // 使用@RabbitListener注解,指定队列名、并发范围和ACK模式 @RabbitListener(queues = "order_queue", concurrency = "5-10", ackMode = "MANUAL") public void handleOrderMessage(Message message, Channel channel) throws IOException { try { // 1. 解析消息内容 String body = new String(message.getBody()); System.out.println("Received order message: " + body); // 2. 处理业务逻辑(例如:创建订单,库存扣减等) processOrder(body); // 3. 手动确认消息,第二个参数multiple表示是否批量确认 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } catch (Exception e) { // 4. 处理失败,拒绝消息并重新入队(第三个参数为requeue) channel.basicReject(message.getMessageProperties().getDeliveryTag(), true); } } private void processOrder(String orderData) { // 模拟业务处理 // 实际业务中可能包含数据库操作、调用其他服务等 } } ``` ### 关键配置说明: - **`queues = "order_queue"`**:指定监听的队列名称,确保RabbitMQ中已经存在该队列(可以通过管理界面或代码声明)。 - **`concurrency = "5-10"`**:设置初始线程数为5,最大可扩展到10个线程。当消息量增加时,容器会自动增加线程处理消息,最高到10个线程。 - **`ackMode = "MANUAL"`**:设置为手动ACK模式。这意味着我们必须在代码中显式调用`basicAck`或`basicReject`来确认消息处理结果。 ### 注意事项: 1. **队列声明**:如果RabbitMQ中还没有`order_queue`队列,需要在应用启动时创建。可以在配置类中使用`@Bean`声明队列: ```java import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean public Queue orderQueue() { return new Queue("order_queue", true); // 第二个参数表示是否持久化 } } ``` 2. **线程池监控**:在实际运行中,可以通过Spring Boot Actuator或日志监控线程池的使用情况,确保线程数在5~10之间动态调整。 3. **异常处理**:在手动ACK模式下,务必捕获异常并进行处理(如拒绝消息并重新入队),避免消息丢失。 ### 性能优化提示: - 结合引用[5]中的配置,可以设置`prefetch`值(在配置文件中)以优化性能,例如: ```yaml spring: rabbitmq: listener: simple: prefetch: 50 # 每个消费者最多预取50条消息 ``` 预取值计算公式参考:$ \text{prefetch} = \text{最大线程数} \times \text{每条消息处理时间} \times \text{期望吞吐量} $(经验值通常设置为最大线程数的2~3倍)。 ### 相关问题 1. 如何在Spring Boot中声明RabbitMQ交换机和队列的绑定关系? 2. 如何监控RabbitMQ消费者的线程池使用情况? 3. 手动ACK模式下,如何处理消息消费失败后的重试机制? </think> ### 配置带有指定参数的 `@RabbitListener` 根据您的需求(queues="order_queue", concurrency="5-10", ackMode="MANUAL"),以下是完整的配置实现步骤: #### 1. 配置文件设置(application.yml) ```yaml spring: rabbitmq: host: your-rabbitmq-host port: 5672 username: your-username password: your-password listener: type: simple simple: acknowledge-mode: manual # 全局手动ACK模式[^5] ``` #### 2. 消费者类实现 ```java @Component public class OrderMessageConsumer { // 核心注解配置 @RabbitListener( queues = "order_queue", // 指定监听队列[^1] concurrency = "5-10", // 动态线程池:5-10个消费者线程[^5] ackMode = "MANUAL" // 手动确认模式[^2] ) public void handleOrderMessage( @Payload String messageBody, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag, Channel channel) throws IOException { try { // 1. 业务处理逻辑 processOrder(messageBody); // 2. 手动确认消息(单个确认) channel.basicAck(deliveryTag, false); } catch (Exception ex) { // 3. 处理失败时拒绝并重新入队 channel.basicReject(deliveryTag, true); // 记录错误日志... } } private void processOrder(String orderData) { // 实际订单处理逻辑 // 例如:数据库操作、第三方服务调用等 } } ``` #### 3. 队列声明配置(可选) 如果队列尚未创建,添加配置类: ```java @Configuration public class RabbitConfig { @Bean public Queue orderQueue() { return new Queue("order_queue", true); // 持久化队列[^1] } // 可添加交换机和绑定配置[^3] } ``` ### 关键配置说明 | 配置项 | 值 | 作用说明 | 来源 | |----------------|-----------|--------------------------------------------------------------------------|----------| | `queues` | order_queue | 指定监听的队列名称 | [^1] | | `concurrency` | 5-10 | 动态线程池:最小5线程,最大10线程(根据负载自动伸缩) | [^5] | | `ackMode` | MANUAL | 手动确认模式:需显式调用basicAck/basicReject | [^2],[^5]| | `prefetch` | 默认1 | 建议在配置文件中单独设置,推荐值:$ \text{线程数} \times 2 $ = 20 | [^5] | ### 验证配置是否生效 1. **启动检查**: - 应用启动时查看日志: ``` Created new consumer: tags=[[]], channel=Cached Rabbit Channel... Container with concurrency: 5-10 ``` 2. **管理界面确认**: RabbitMQ管理界面 → Queues → order_queue: - 查看消费者数量应在5-10之间波动 - 确认`Ack mode`列为`manual` 3. **压力测试**: ```bash # 发送测试消息 rabbitmqadmin publish exchange=amq.default routing_key=order_queue payload="test" ``` ### 注意事项 1. **线程安全**: - 多线程环境下确保`processOrder()`方法无状态或使用线程安全组件 - 避免在消费者中使用`synchronized`关键字 2. **错误处理增强**: ```java // 在basicReject后添加延迟重试 channel.basicReject(deliveryTag, false); resendToRetryQueue(message); // 自定义重试队列逻辑 ``` 3. **资源监控**: ```java // 添加线程池监控 @Autowired private RabbitListenerEndpointRegistry registry; public void monitorThreads() { registry.getListenerContainers().forEach(container -> { System.out.println("Active consumers: " + ((SimpleMessageListenerContainer)container).getActiveConsumerCount()); }); } ``` ### 性能预期 根据配置计算理论吞吐量: $$ \text{最大吞吐量} = \text{单线程处理能力} \times \text{最大线程数} $$ 假设单线程处理能力为2.6/s(取自您的数据),则: $$ \text{最大吞吐量} = 2.6 \times 10 = 26/\text{s} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lxr1908

用钱砸我

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

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

打赏作者

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

抵扣说明:

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

余额充值