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分鐘之內才給你取消。?