menbbo

导航

 

码云地址:https://gitee.com/menbbo/springboot-rabbitmq-routing.git

RabbitMQ的工作模式包括了:简单模式、工作队列模式、发布订阅模式、路由模式、TOPIC(通配符模式)以及RPC。本文主要介绍路由模式。

 

上图是RabbitMQ的路由工作模式,该模式下一个交换机可以绑定多个队列,每个队列可以指定多个RoutingKey,每个消费者监听自己的队列,生产者将信息发送给交换机,交换机用该信息的routingkey判断与哪个队列的RoutingKey相等,将信息发送给与其RoutingKey相等的队列中。

SpringBoot整合RabbitMQ实现路由工作模式

实现生产者

 1.创建父工程springboot-rabbit-routing,父工程下创建producer模块作为生产者,pom文件中导入依赖。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.application.properties配置文件中配置rabbitMQ相关信息:

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
server.port=8082

3.创建RabbitConfig类,用来生成队列,交换机,并将其绑定,设定routingKey,在类中创建了emailQueue以及SMSQueue两个队列。

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {
    @Bean(name = "emailQueue")
    public Queue createEmailQueue(){
        return new Queue("emailQueue");  //创建email队列
    }

    @Bean(name = "SMSQueue")
    public Queue createSMSQueue(){
        return new Queue("SMSQueue"); // 创建SMS队列
    }

    /**
     * 创建DirectExchange类型的交换机
     * @return
     */
    @Bean(name = "RoutingExChange")
    public DirectExchange directExchange(){
        return new DirectExchange("RoutingExChange");
    }

    /**
     * 将email队列与交换机绑定
     * @return
     */
    @Bean
    public Binding bindingExchangeEmail(@Qualifier("emailQueue") Queue eamilQueue,@Qualifier("RoutingExChange") DirectExchange directExchange){
        return BindingBuilder.bind(eamilQueue).to(directExchange).with("email"); //将队列与交换机绑定 并设定routingkey
    }
    @Bean
    public Binding bindingExchangeSMS(@Qualifier("SMSQueue") Queue SMSQueue,@Qualifier("RoutingExChange") DirectExchange directExchange){
        return BindingBuilder.bind(SMSQueue).to(directExchange).with("SMS");  //将RoutingExChange与队列SMSQueue绑定,设定routingKey为SMS
    }
}

4.测试类中将信息发送到相关队列中,分别通过RoutingKey参数来实现发送信息到不同队列。

@SpringBootTest
class ProducerApplicationTests {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() {
        String message1 = "路由模式发送邮件信息";
        rabbitTemplate.convertAndSend("RoutingExChange","email",message1);//
        String message2 = "路由模式发送SMS信息";
        rabbitTemplate.convertAndSend("RoutingExChange","SMS",message2);
    }

}

 

 实现消费者

1.消费者共有两个,分别是sms_consumer和email_consumer。分别创建这两个module,以sms_consumer为例,首先导入maven依赖。

<dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
 </dependency>

2.配置RabbitMQ相关信息。

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
server.port=8083

3.创建SMSConsumer类,用来从队列中接收信息。

@Component
@RabbitListener(queues = "SMSQueue")//消费者对SMSQueue队列进行监听
public class SMSConsumer {
    @RabbitHandler
    public void receiveMessage(String data){
        System.out.println("SMS消费信息:"+data);
    }
}

实验结果:

启动生产者,查看RabbitMQ管理界面,发现队列中存放了信息。

 

 分别启动两个消费者,消费者分别取得消息。

 

 

posted on 2020-08-06 23:09  menbbo  阅读(395)  评论(0编辑  收藏  举报