6.24_JAVA_微服务day07_RabbitMQ高级

发布于:2025-06-25 ⋅ 阅读:(22) ⋅ 点赞:(0)

1、

    @RabbitListener(queuesToDeclare/*此处是固定写法,只能写这个玩意儿,因为这里是库里的方法*/ = @Queue(
            name = "lazy.queue",//如果不存在就创建lazy.queue队列
            durable = "true",//把耐用打开
            arguments = @Argument(name = "x-queue-mode", value = "lazy")//把lazy模式打开,至于为什么是"x-queue-mode",这个"x-queue-mode"纯粹是Spring底层就这么写的,你想调用这个方法(注解)只能这样调用。学代码最重要的就是会用,别去管为什么,会用就行。别造轮子,别把这些API当成算法的学,入门最重要。入了门有的是把这些API当成算法来学的机会。
    ))
    public void listenLazyQueue(String msg){
        log.info("接收到 lazy.queue的消息:{}", msg);
    }

2、消费者确认机制(Consumer Acknowledgement):如何确保没得到确认的消息不被RMQ删除呢?

        S1 、改成auto

spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: auto # 自动ack

        S2、throw new RuntimeException,而不扔MessageConversionException

    @RabbitListener(queues = "simple.queue")
    public void listenSimpleQueueMessage(String msg) throws InterruptedException {
        log.info("spring 消费者接收到消息:【" + msg + "】");
        if (true) {
            throw new RuntimeException("故意的");
        }
        log.info("消息处理完成");
    }

3、失败重试机制:防止消费者接收不到之后,无限投递

        S1修改consumer的yaml

spring:
  rabbitmq:
    listener:
      simple:
        retry:
          enabled: true # 开启消费者失败重试
          initial-interval: 1000ms # 初识的失败等待时长为1秒
          multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
          max-attempts: 3 # 最大重试次数
          stateless: true # true无状态;false有状态。如果业务中包含事务,这里改为false

4、导入这些Queue、Exchange这种东西的包,会让你选很多包。选amqp(spring-boot-starter-amqp)那个包。且带核心的那个包。因为这玩意儿的依赖是这个:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

 所以选这个:

5、RoutingKey是个啥?是消息从交换机路由到队列的关键规则。注意:error是自己定义的名字,你完全可以叫它其他名,比如my.error等

6、 唯一消息ID是啥?用于判断是否只执行一次,防止重复。

       唯一ID用在哪?比如订单之类的。

7、

订单、付款这种处理钱的时候,尽量放到同一个方法里。 防止极小概率的线程安全问题。

8、延迟消息:应用如:15分钟内付款。在代码层面就是:要给你取消订单,但是你不15分钟之内才给你取消。 


网站公告

今日签到

点亮在社区的每一天
去签到