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