• (二)Spring boot 集成 RabbitMQ 的demo(转)


     先贴个链接:

    demo在这:https://www.cnblogs.com/boshen-hzb/p/6841982.html

    这里重点只是解释下步骤和一些类的区别

    下面是Rabbit MQ的原理图,

    可以发先,所有的消息都是先经由 Exchange (交换器)进行转发到 Queue(队列)中,然后消费者会从Queue中取出数据,消息就是存储到 队列 中的。

      

     有百度搜的,有个人理解。自己做笔记使用

      

      Queue的介绍

        /**
         * 创建一个队列
         * @return
         */
        @Bean
        public Queue helloQueue() {
            return new Queue("hello");
        }
        

     //此处的Queue是可以做其他配置的

      源码是这样的

      

    public Queue(String name) {
            this(name, true, false, false);
        }

      还有一个构造器是这样的

        public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
            Assert.notNull(name, "'name' cannot be null");
            this.name = name;  //名称
            this.durable = durable; //是否持久化
            this.exclusive = exclusive; //是否排外(多个链接访问时,只能有一个进来)
            this.autoDelete = autoDelete; //是否自动删除
            this.arguments = arguments; //这个。。默认为null 具体是啥。我也不知道
        }

     Exchange 交换器的介绍

      Rabbit MQ中有四种交换器 fanout,direct,topic,header(使用较少)

      (一)DirectExchange

       /**
         * 
         * 1默认的Exchage,该Exchage的名字为空字符串,
         * 2这种模式下不需要将Exchage进行任何的绑定(binding)操作
         * 3消息传递时需要一个“RouteKey”,可以简单的理解为要发送的队列的名字。
         * 4如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。 
         */
        @Bean
        public DirectExchange directExchange(){
            return new DirectExchange("directExchange");
        }

      (二)FanoutExchange

        /**
         * 任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
         *  Fanout Exchange  任何发送到 FanoutExchange的消息都会被转发到与该路由绑定的所有queue上
         *  1可以理解为路由表的模式
         *  2这种模式不需要RouteKey  (这是个什么鬼。)
         *  3这种模式需要提前将Exchange与Queue进行绑定,一个交换机可以绑定多个queue,一个Queue可以与多个Exchange进行绑定
         *  4如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃
         */
        @Bean
        public FanoutExchange fanoutExchange() {
            return new FanoutExchange("fanoutExchange");
        }

      (三)TopicExchange

     /**
         *    
         * 任何发送到TopicExchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
         * 1这种模式比较复杂,简单的说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列                     
         * 2这种模式需要RouteKey,也许要提前绑定Exchange与Queue.
         * 3在进行绑定时,要提供一个该队列关心的主题 ,如“#.log.#”标识该队列关心所有涉及log的消息(一个RouteKey为“MQ.log.error”的消息会被转发到该队列)。
         * 4“#”标识0个或若干个关键字,“*”表示一个关键字,如“log.*”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
         * 5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息
         */
        @Bean
        public TopicExchange exchange() {
            return new TopicExchange("topicExchange");
        }

     而 在开头的Demo中, 是这样发送消息的

        

    /**
     * 他们说这是一个生产者
     * @author Administrator
     */
    @Component
    public class HelloSender1 {
        //注入一个mq模板对象
        @Autowired
        private AmqpTemplate amqpTemplate;
        
           public void send()  {
                String sendMsg = "hello1 " + new Date();
                System.out.println("Sender1 : " + sendMsg);
                    //此处的"hello"是一个队列,将这个消息发送到hello队列中 
                amqpTemplate.convertAndSend("hello", sendMsg); 
            }
    }

    看起来是直接发送到了Queue中 其实 是发送到了 一个默认 的交换器上。后转发到Queue 中的。

    https://www.jianshu.com/p/2c5eebfd0e95

  • 相关阅读:
    OneNote 2010 文字识别
    Windows 7 添加网络共享打印机
    logstash
    filebeat
    记elk打包时的问题
    elasticsearch.yml
    zabbix 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
    mac装brew
    snmp监控
    博科光纤交换机端口别名映射脚本
  • 原文地址:https://www.cnblogs.com/x-ph/p/9382882.html
Copyright © 2020-2023  润新知