消息队列MQ

RabbitMq

本文主要是介绍RabbitMq,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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."就可以
    
这篇关于RabbitMq的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!