Spring Boot Rabbitmq 实现消费者并发监听

首先,配置一个spring 线程池

@Slf4j
@Configuration
public class TaskExecutorConfig implements AsyncConfigurer {
   @Override
   public Executor getAsyncExecutor() {
      ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
      taskExecutor.setCorePoolSize(4);
      taskExecutor.setMaxPoolSize(8);
      taskExecutor.setQueueCapacity(100);
      taskExecutor.setThreadNamePrefix("myExecutor-");
      taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
      taskExecutor.initialize();
      log.debug("Thread pool initialization.");
      return taskExecutor;
   }

   @Override
   public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
      return null;
   }
}

注意启动线程池@EnableAsync  在*Application.java上加入这个注解

配置文件: application.yaml

spring:
  rabbitmq:
    host: 192.168.*.*  //ip
    port: 5672 //端口
    username: admin  //用户名
    password: 123456   //密码
    publisher-confirms: true  //消息接收确认
    publisher-returns: true  //消息失败返回
    template:
      mandatory: true  //失败返回需要为true
    listener:
      direct:
        acknowledge-mode: manual  //手动 ack
      simple:
        acknowledge-mode: manual  //手动 ack

消息转化器配置: Jackson2JsonMessageConverter,比默认的SerializerMessageConverter强大

@Configuration
public class RabbitMQConfig {
   @Bean
   public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
      RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
      // 必须设置为 true,不然当 发送到交换器成功,但是没有匹配的队列,不会触发 ReturnCallback 回调
      // 而且 ReturnCallback 比 ConfirmCallback 先回调,意思就是 ReturnCallback 执行完了才会执行 ConfirmCallback
      rabbitTemplate.setMandatory(true);
      rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
      return rabbitTemplate;
   }

   @Bean
   public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
      SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
      factory.setConnectionFactory(connectionFactory);
      factory.setMessageConverter(new Jackson2JsonMessageConverter());
      factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);    // 修改了messageConverter后需要重新设置手动确认
      return factory;
   }
}

然后,作为消费者的方法上加入注解监听异步注解

@Async  // 异步注解, 相当于多个消费者在监听一个生产者的消息
@RabbitListener(bindings = {  // 消费者监听, bindings 绑定交换机和队列
      @QueueBinding(
            exchange = @Exchange(value = "交换机名字", type = ExchangeTypes.TOPIC),  // topic 类型,模糊路由键接收
            value = @Queue(value = "队列名字", durable = "true"), // durable = true 持久化
            key = "路由键(例: consumer.#)" // 接收consumer.a、consumer.b 等前缀相同的路由键
      )
})
// args 接收的参数,对应生产者传递的类型,  channel 接口可用来发送消息或确认消息被消费, @Header 获取头信息, tag表示该消息index
public void receiveMsg(Object args, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
   //处理args消息信息过程
   
   // 下面是手动消息应答
   // channel.basicAck(tag, false);  作用:消息确认接收,参数2是否批量,true表示一次性ack所有小于tag的消息
   // channel.basicNack(tag, false, true) 作用:拒绝或重新入队列, 参数2是否批量同上,参数3被拒绝的是否重新入队列 
   // channel.basicReject(tag, false) 作用:拒绝或重新入队列(只能一次拒绝一条消息),参数2被拒绝的是否重新入队列 
}

有一些心得分享一下:有时候只想在一个项目中,监听一个消费者,比如:消费者1,消费者2都是将接收的消息保存到各自的数据库中,那么我们可以在配置文件中指明各自消费者的配置项

spring:
  profiles:
    active: 消费者1配置文件

消费者1配置文件
spring:
  rabbitmq:
    routingkey: **.**
    receive-queue: 接收队列名1

@RabbitListener(bindings = {
      @QueueBinding(
            exchange = @Exchange(value = "交换机名字"),
            value = @Queue(value = "${spring.rabbitmq.receive-queue}", durable = "true"),
            key = "${spring.rabbitmq.routingkey}"
      )
})

这样在注解中使用spel 表达式,就可以获取对应的值,动态监听消费者

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot中编写RabbitMQ消费者很简单,你可以按照以下步骤进行操作: 1. 首先,确保你的Spring Boot项目已经添加了RabbitMQ的依赖。你可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 创建一个消息处理类,用于处理接收到的消息。这个类需要实现`org.springframework.amqp.rabbit.annotation.RabbitListener`注解,该注解用于指定消费者监听的队列名称。示例如下: ```java import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class MessageConsumer { @RabbitListener(queues = "your_queue_name") public void receiveMessage(String message) { // 处理接收到的消息 System.out.println("Received message: " + message); } } ``` 在上面的示例中,我们创建了一个名为`MessageConsumer`的类,并使用`@RabbitListener`注解指定了消费者监听的队列名称为`your_queue_name`。`receiveMessage`方法用于处理接收到的消息,在这里你可以自定义你的业务逻辑。 3. 在应用程序启动类上添加`@EnableRabbit`注解,开启RabbitMQ的支持。例如: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.amqp.rabbit.annotation.EnableRabbit; @SpringBootApplication @EnableRabbit public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 通过添加`@EnableRabbit`注解,Spring Boot会自动扫描并创建RabbitMQ的相关实例。 现在,你已经完成了RabbitMQ消费者的编写。当消息被发送到指定的队列时,消费者将会自动接收并处理这些消息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值