1. 程式人生 > 其它 >P5682 [CSP-J2019 江西] 次大值

P5682 [CSP-J2019 江西] 次大值

boot快速使用RabbitMq

pom.xml檔案引入

<!--spring-boot對rabbitmq的支援-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

Base工作模式

  1. 生產者在配置類中宣告佇列

    // 宣告佇列
    @Bean
    public Queue baseQueue() {
        return new Queue("佇列名稱");
    }
    
  2. 生產者傳送訊息

    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage() {
        //base模式,rotingKey就是佇列名稱 Object代表訊息
        rabbitTemplate.convertAndSend(roteingKey, Object);
    }
    
  3. 消費者消費訊息

    @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. 配置類

    // 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();
        }
    
  2. 生產者程式碼

    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage() {
        //fanout模式下,rotingKey為""
        rabbitTemplate.convertAndSend("交換機","","訊息");
    }
    
    # 總結
    	
    1. fanout模式下,rotingKey為""
    	
    2. 訊息監聽與base\work模式一致
    	
    3. 生產者將訊息傳送給交換機
    

Direct工作模式

  1. 配置類

    //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();
        }
    
  2. 生產者程式碼

    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage() {
        //direct模式下,訊息傳送時,需要明確指定的rotingKey
        rabbitTemplate.convertAndSend("交換機","rotingKey","訊息");
    }
    
    # 總結
    
    1. direct模式,宣告佇列與交換機的繫結關係時,需要指定rotingKey,生產者傳送訊息時,需要明確指定該rotingKey
    
    2. 生產者傳送訊息給交換機
    

Topic工作模式

  1. 配置類

    //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."就可以