zoukankan      html  css  js  c++  java
  • rabbitMQ工作模式(二)路由模式

    码云地址: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管理界面,发现队列中存放了信息。

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

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何添加Scope监控
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何使用随机数DRAND模块
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何使用断点
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何实现开平方的Pow函数
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何声明定时器,使用定时器TON模块 TC3
    倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何声明定时器,使用定时器TON模块 TC2
    java中配置自定义拦截器中exclude-mapping path是什么意思?
    java web 过滤器跟拦截器的区别和使用
    利用jquery.validate异步验证用户名是否存在
    jquery统计显示或隐藏的元素个数
  • 原文地址:https://www.cnblogs.com/menbo/p/13449678.html
Copyright © 2011-2022 走看看