SpringBoot+RabbitMQ_实现“路由模式“

一、RabbitMQ"路由模式"简介

    RabbitMQ有七种队列模型,"简单队列"、"工作队列"、"发布订阅"、"路由模式"、"主题模式"、"RPC模式"、"发布者确认模式"。

    官网地址:https://www.rabbitmq.com/getstarted.html

路由模式:

    相较于"简单队列","路由模式"增加了交换机(图中紫色的X),生产者生产的消息不会直接进入到队列中,而是先将消息发送到了交换机,再由交换机转发到相应的队列中。一个队列可以有多个消费者,但发送到队列的消息只能被其中一个消费。

    在7种队列模式中,同样用到交换机的还有"发布订阅"、"主题模式"。不同队列模式的交换机的类型是不一样的,"路由模式"的交换机类型为direct,"发布订阅"的交换机类型为fanout,"主题模式"的交换机类型为topic。

    在"路由模式"种,交换机和队列要进行绑定,会有一个Binding key,发送消息是要指定交换机,和一个Routing key,当Binding key和Routing key相同的时候,交换机才会把消息发送到对应的队列中,如果没有匹配上的队列,交换机会将消息抛弃。

 

    交换机支持多重绑定,不同的队列可以用相同的Binding key与同一交换机绑定,发送消息时向每个匹配上的队列中发送消息。

   

    相同的队列可以用不同的Binding key与同一交换机绑定,发送消息时向每个匹配上的队列中发送消息。

二、"路由模式"代码的实现

2.1 引入jar包

<!-- rabbitmq依赖  strat-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- rabbitmq依赖 end-->

2.2 RabbitMQ配置文件

创建队列,创建交换机,交换机与队列绑定。

@Configuration
public class RabbitConfig {

    /**
     * 创建2个队列
     **/
    @Bean
    public Queue fruitsQueue(){
        return new Queue("fruits_queue");
    }

    @Bean
    public Queue meatQueue(){
        return new Queue("meat_queue");
    }


    /**
     * 声明一个Direct类型的交换机
     **/
    @Bean
    DirectExchange directExchange(){
        return new DirectExchange("xue_exchange");
    }

    /**
     * 将上面的2个队列绑定到Direct交换机,在绑定的时候指定BindingKey
     **/
    @Bean
    Binding bindExchangeFruits(Queue fruitsQueue, DirectExchange directExchange){
        return BindingBuilder.bind(fruitsQueue).to(directExchange).with("fruits");
    }

    @Bean
    Binding bindExchangeMeat(Queue meatQueue,DirectExchange directExchange){
        return BindingBuilder.bind(meatQueue).to(directExchange).with("meat");
    }
}

2.3 生产者

@Component
public class Publisher {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者将消息发送到Direct交换机,发送的时候携带RoutingKey
     **/
    public void sendMessage() {
        String message = "apple";
        System.out.println("发送消息 : " + message);
        //convertAndSend(交换机名称,交换机和队列之间绑定的key,routingKey,消息)
        rabbitTemplate.convertAndSend("xue_exchange","fruits",message);
    }
}

2.4 消费者

@Component
public class Consumer  {

    @RabbitListener(queues = "fruits_queue")
    @RabbitHandler
    public void processA(String message) {
        System.out.println("消息路由到了队列fruits_queue: " + message);
    }

    @RabbitListener(queues = "meat_queue")
    @RabbitHandler
    public void processB1(String message) {
        System.out.println("消息路由到了队列meat_queue: " + message);
    }
}

2.5 测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class FirstprojectApplicationTests {

    @Autowired
    Publisher publisher;

    @Test
    public void contextLoads() {
        publisher.sendMessage();
    }
}

 


版权声明:本文为weixin_40877388原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。