怎么在SpringBoot中利用RabbitMQ 实现一个手动应答功能
创始人
2024-12-28 08:21:20
0次

版本说明

  • JDK 1.8

  • RabbitMQ 3.7.15 Erlang 22.0

  • SpringBoot 2.3.3.RELEASE

  • // TODO 2021年1月8日 整理CentOS安装RabbitMQ流程

1. 在RabbitMQ的Web管理界面,创建test队列

怎么在SpringBoot中利用RabbitMQ 实现一个手动应答功能

参数的含义

durability:是否持久化(重启或宕机后消息依然保存)

  • durable 持久

  • transient 暂时

新建maven项目。

2. pom.xml



  4.0.0

  
    org.springframework.boot
    spring-boot-starter-parent
    2.3.3.RELEASE
     
  

  com.demo
  rabbitmq-demo
  1.0.0

  
    1.18.12
  

  
    
    
      org.springframework.boot
      spring-boot-starter-web
    

		
    
      org.springframework.boot
      spring-boot-starter-amqp
    

    
    
      org.projectlombok
      lombok
      true
      provided
      ${lombok.version}
    
  

  
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
    
  

3. application.yaml

server:
 port: 20002
spring:
 rabbitmq:
 	# 这里我改了本地的hosts,实际地址是192.168.0.121
  host: vm.com
  port: 5672
  virtual-host: /
  username: admin
  password: admin
  # 开启消息确认模式
  # 消息发送到交换机确认机制,是否确认回调
  # publisher-confirms: true
  # 是否返回回调
  publisher-returns: true
  template:
   #开启mandatory: true, basic.return方法将消息返还给生产者
   mandatory: true
  listener:
   simple:
   	# 手动应答
    acknowledge-mode: manual
    # 最少消费者数量
    concurrency: 1 
    # 最多消费者数量
    max-concurrency: 10
    # 支持重试
    retry:
     enabled: true

端口

  • 5672:RabbitMQ的通信端口

  • 15672:Web管理界面端口

4. RabbitmqDemo.java

@SpringBootApplication
@EnableRabbit
public class RabbitmqDemoApplication {
  
  public static void main(String[] args) {
    SpringApplication.run(RabbitmqDemoApplication.class, args);
  }
}

5. RabbitConfig.java

@Configuration
@Slf4j
public class RabbitConfig {

  private RabbitTemplate rabbitTemplate;

  @Bean
  public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
    rabbitTemplate = new RabbitTemplate(connectionFactory);
    return rabbitTemplate;
  }

}

配置RabbitMQ的消息模板。

6. 消息生产者 produce.java

@Component
public class Producer {
  
  // @Qualifier("rabbitTemplate")
  @Autowired
  private RabbitTemplate rabbitTemplate;

  public void send() {
    for (int i = 0; i < 5; i++) {
      System.out.println("生产者发送消息,序号为: " + i);
      rabbitTemplate.convertAndSend("test", String.valueOf(i));
    }
  }
}

初始化消息发送模板RabbitTemplate,@Qualifier注解用于限定具体的实现类,这里可以不指定。

7. 消息消费者 consumer.java

消费者1和消费者2均监听test队列。

不同的是,消费者1收到消息后返回确认应答basicAck。

而消费者2收到消息后返回拒绝应答basicRegect,消息被消费者拒绝后重新回到test队列中,等待下次发送给消费者。

@Component
@Slf4j
public class Consumer {

  /**
   * 消费者1 模拟正常处理消息的情况,消息处理完毕发送确认应答
   * @param message
   * @param channel
   * @throws IOException
   */
  @RabbitListener(queues = "test")
  public void process1(Message message, Channel channel) throws IOException {
    log.info("消费者1 接收消息: " + new String(message.getBody()));
    log.info("消费者1 确认应答消息:" + new String(message.getBody()));
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
  }

  /**
   * 消费者2 模拟处理消息出错的情况,消费者2向rabbitmq发送拒绝应答。
   * 处理失败的消息会被重新放入ready中,再次发送给消费者,直至收到确认应答
   * @param message
   * @param channel
   * @throws IOException
   */
  @RabbitListener(queues = "test")
  public void process2(Message message, Channel channel) throws IOException {
    log.info("消费者2 接收消息:" + new String(message.getBody()));
    log.info("消费者2 拒绝应答消息:" + new String(message.getBody()));
    channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
  }
}

8. 测试RabbitMqController.java

@RestController
@RequestMapping("")
public class RabbitMqController {

  @Autowired
  private Producer producer;

  @GetMapping("/send")
  public String send() {
    producer.send();
    return "发送完成";
  }
}

9. 测试

使用postman或浏览器使用Get方法请求http://localhost:20001/send,生产者会向RabbitMQ的test队列发送5条消息:

生产者发送消息,序号为: 0
生产者发送消息,序号为: 1
生产者发送消息,序号为: 2
生产者发送消息,序号为: 3
生产者发送消息,序号为: 4

怎么在SpringBoot中利用RabbitMQ 实现一个手动应答功能

可以看出序号为2的消息3次被消费者2接收,消费者2也3次发送拒绝应答,直到第4次才被消费者1接收,并返回确认应答。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...