先貼個連接: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