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-intervalmax-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分钟之内才给你取消。