P5682 [CSP-J2019 江西] 次大值
阿新 • • 發佈:2021-10-15
boot快速使用RabbitMq
pom.xml檔案引入
<!--spring-boot對rabbitmq的支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
Base工作模式
-
生產者在配置類中宣告佇列
// 宣告佇列 @Bean public Queue baseQueue() { return new Queue("佇列名稱"); }
-
生產者傳送訊息
@Autowired private RabbitTemplate rabbitTemplate; public void sendMessage() { //base模式,rotingKey就是佇列名稱 Object代表訊息 rabbitTemplate.convertAndSend(roteingKey, Object); }
-
消費者消費訊息
@RabbitListener(queues = "佇列名稱") public void baseListener(Object obj){ }
# 總結 1. base模式是點對點消費,生產者將訊息直接傳送給佇列(而非交換機) 2. 消費者通過監聽佇列來進行消費
Work工作模式
# 總結 1. work工作模式,配置類,生產者、消費者程式碼與base模式一致 2. 區別在於,work模型有多個消費者針對一個佇列的訊息進行消費,每個消費者每次消費的訊息不一樣,使用多個佇列的目的是為了快速消費訊息 3. work工作模式,可根據消費者效能設定訊息的拉取速率(僅在手動簽收模式下好用) spring: rabbitmq: listener: simple: acknowledge-mode: auto # 消費者消費訊息,預設為自動簽收 manual為手動簽收 prefetch: 1 #配置拉去效率,數字越大效率越高
Fanout工作模式
-
配置類
// 1. 宣告佇列 // 2. 宣告Fanout交換機 @Bean public Exchange fanoutExchange() { return new FanoutExchange("交換機名稱"); } // 3. 宣告佇列與交換機的繫結關係 rotingKey為空 @Bean public Binding fanoutABinding(@Qualifier("fanoutQueueA") Queue queue, @Qualifier("fanoutExchange") Exchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("").noargs(); }
-
生產者程式碼
@Autowired private RabbitTemplate rabbitTemplate; public void sendMessage() { //fanout模式下,rotingKey為"" rabbitTemplate.convertAndSend("交換機","","訊息"); }
# 總結 1. fanout模式下,rotingKey為"" 2. 訊息監聽與base\work模式一致 3. 生產者將訊息傳送給交換機
Direct工作模式
-
配置類
//1. 宣告佇列 //2. 宣告Direct交換機 @Bean public Exchange directExchange() { return new DirectExchange(DIRECT_EXCHANGE_NAME); } //3. 宣告佇列與交換機的繫結關係 - 需要指定唯一的rotingKey @Bean public Binding directABinding(@Qualifier("directAQueue") Queue queue, @Qualifier("directExchange") Exchange exchange) { return BindingBuilder.bind(queue).to(exchange).with("rotingKey").noargs(); }
-
生產者程式碼
@Autowired private RabbitTemplate rabbitTemplate; public void sendMessage() { //direct模式下,訊息傳送時,需要明確指定的rotingKey rabbitTemplate.convertAndSend("交換機","rotingKey","訊息"); }
# 總結 1. direct模式,宣告佇列與交換機的繫結關係時,需要指定rotingKey,生產者傳送訊息時,需要明確指定該rotingKey 2. 生產者傳送訊息給交換機
Topic工作模式
-
配置類
//1. 宣告佇列 //2. 宣告Topic交換機 @Bean public Exchange topicExchange() { return new TopicExchange(TOPIC_EXCHANGE_NAME); } //3. 宣告繫結關係
# 總結 1. topic模式是在direct模式的基礎上增加了多級匹配 *:匹配一級 #:匹配多級 2. 生產者傳送訊息給交換機 3. 宣告佇列、交換機、以及他們之間的繫結方式一樣,需要注意的是rotingKey 舉個栗子: 宣告繫結關係: 假設我們佇列A在繫結交換機使用的rotingKey="topic.brave.*", 佇列B在繫結交換機時使用的rotingKey="topic.#" 消費者傳送訊息: 向佇列A傳送訊息時,rotingkey的形式只能限制為"topic.brave.*", * 可以代表任意 向佇列B傳送訊息時,rotingKey的形式只需滿足字首"topic."就可以