(二)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

原文地址:https://www.cnblogs.com/x-ph/p/9382882.html