先贴个连接:html
demo在这:https://www.cnblogs.com/boshen-hzb/p/6841982.htmlthis
这里重点只是解释下步骤和一些类的区别spa
下面是Rabbit MQ的原理图,code
能够发先,全部的消息都是先经由 Exchange (交换器)进行转发到 Queue(队列)中,而后消费者会从Queue中取出数据,消息就是存储到 队列 中的。htm
有百度搜的,有我的理解。本身作笔记使用对象
Queue的介绍blog
/** * 建立一个队列 * @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