RabbitMQ的基本概念

Vhosts 虛擬機

虛擬機可以理解為RabbitMQ的獨立劃分空間(有點類似mini版的RabbitMQ),RabbitMQ支持多個虛擬機,虛擬機里面不能有同名的交換機于样。

Exchange交換機

交換機可以RabbitMQ的消息處理中心(類似快遞分揀中心)負(fù)責(zé)消息分類管理
交換機有4種消息投遞模式

  • 1.Direct模式(根據(jù)路由key 直連模式,完全匹配模式)需要聲明隊列

    1.代碼示例
/**
  生產(chǎn)端
 **/
 private static final String QUEUE_NAME = "test_simple_queue";
 private static final String EXCHANGE_DIRECT = "test_exchange_direct";
 /**
  * direct 模式
  * 只有隊列名稱完全比配上才能送達(dá)
  */
 public static void exchange_direct(String msg){
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //創(chuàng)建交換機
         channel.exchangeDeclare(EXCHANGE_DIRECT, BuiltinExchangeType.DIRECT);
         String message = msg;
         //發(fā)送消息
         channel.basicPublish(EXCHANGE_DIRECT, QUEUE_NAME, null, message.getBytes("utf-8"));
         System.out.println("[發(fā)送]:" + message);
         channel.close();
         connection.close();
     }
     catch (Exception e) {
         e.printStackTrace();
     }

 }


/**
* 消費端
*/
public class Receive {

 private static final String QUEUE_NAME = "test_simple_queue";

 public static void main(String[] args) {
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //聲明隊列
         channel.queueDeclare(QUEUE_NAME, false, false, false, null);
         //定義消費者
         DefaultConsumer consumer = new DefaultConsumer(channel) {
             //當(dāng)消息到達(dá)時執(zhí)行回調(diào)方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                        byte[] body) throws IOException {
                 String message = new String(body, "utf-8");
                 System.out.println("[消費]:" + message);
             }
         };
         //監(jiān)聽隊列
         channel.basicConsume(QUEUE_NAME, true, consumer);
     }
     catch (Exception  e) {
         e.printStackTrace();
     }
 }
}

  • 2.Topic模式(根據(jù)路由key 模糊匹配模式 )需要聲明隊列

    1.代碼示例
 private static final String EXCHANGE_TOPIC = "test_exchange_topic";
 public static final String ROUTING_KEY = "*.topic";
/**
  * topic 模式
  * 根據(jù)路由key模糊匹配功
  * *僅代表一個單詞 *.topic 能匹配 a.topic,b.topic 等
  * #代表任意個單詞 #.topic 能匹配  a.b.c.topic  等
  */
 public static void exchange_topic(String msg){
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //創(chuàng)建交換機
         channel.exchangeDeclare(EXCHANGE_TOPIC, BuiltinExchangeType.TOPIC);
         //聲明隊列
         String message = msg;
         //發(fā)送消息
         channel.basicPublish(EXCHANGE_TOPIC, ROUTING_KEY, null, message.getBytes("utf-8"));
         System.out.println("[發(fā)送]:" + message);
         channel.close();
         connection.close();
     }
     catch (Exception e) {
         e.printStackTrace();
     }

 }


/**
  * topic 模式 消費端
  */
 private static final String QUEUE_NAME2 = "test.topic";
 private static final String EXCHANGE_TOPIC = "test_exchange_topic";
 //路由
 public static final String ROUTING_KEY = "*.topic";

     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //聲明隊列
         channel.queueDeclare(QUEUE_NAME2, false, false, false, null);
         //綁定交換機
         channel.queueBind(QUEUE_NAME2, EXCHANGE_TOPIC, "");
         //定義消費者
         DefaultConsumer consumer = new DefaultConsumer(channel) {
             //當(dāng)消息到達(dá)時執(zhí)行回調(diào)方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                        byte[] body) throws IOException {
                 String message = new String(body, "utf-8");
                 System.out.println("[消費2]:" + message);
             }
         };
         //監(jiān)聽隊列
         channel.basicConsume(QUEUE_NAME2, true, consumer);
     }
     catch (Exception  e) {
         e.printStackTrace();
     }

 }
  • 3.Fanout模式 (廣播模式,綁定該交換機的列隊都能接受) 無需聲明隊列

    1.代碼示例
 private static final String EXCHANGE_FANOUT = "test_exchange_fanout";
 /**
  * fanout 模式
  * 綁定了同一交換機內(nèi)的所有隊列都能接收
  */
 public static void exchange_fanout(String msg){
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //創(chuàng)建交換機
         channel.exchangeDeclare(EXCHANGE_FANOUT, BuiltinExchangeType.FANOUT);
         //聲明隊列
         String message = msg;
         //發(fā)送消息
         channel.basicPublish(EXCHANGE_FANOUT, "", null, message.getBytes("utf-8"));
         System.out.println("[發(fā)送]:" + message);
         channel.close();
         connection.close();
     }
     catch (Exception e) {
         e.printStackTrace();
     }
 }


 /**
  * 消費端
  *
  */

 private static final String EXCHANGE_FANOUT = "test_exchange_fanout";
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //聲明隊列
         channel.queueDeclare("", false, false, false, null);
         //綁定交換機
         channel.queueBind("", EXCHANGE_FANOUT, "");
         //定義消費者
         DefaultConsumer consumer = new DefaultConsumer(channel) {
             //當(dāng)消息到達(dá)時執(zhí)行回調(diào)方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                        byte[] body) throws IOException {
                 String message = new String(body, "utf-8");
                 System.out.println("[消費2]:" + message);
             }
         };
         //監(jiān)聽隊列
         channel.basicConsume(QUEUE_NAME3, true, consumer);
     }
     catch (Exception  e) {
         e.printStackTrace();
     }
  • 4.Headers 模式(不處理路由鍵。而是根據(jù)發(fā)送的消息內(nèi)容中的headers屬性進(jìn)行匹配) 無需聲明隊列

    1.代碼示例
 /**
  * header模式
  * 根據(jù)消息頭的建 值匹配消息
  * AMQP.BasicProperties
  * 注意點 x-match 有兩個屬性, any(滿足一條即可),all(必須滿足所有)
  */
 public static void exchange_header(String msg){
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();
         //創(chuàng)建交換機
         channel.exchangeDeclare(EXCHANGE_HEADER, BuiltinExchangeType.HEADERS);
         //聲明隊列
         String message = msg;
         //設(shè)置消息頭
         Map<String,Object> map = new HashMap<>();
         map.put("name","fzh1");
         map.put("x-match","any");
//          map.put("x-match","all");
         AMQP.BasicProperties properties = new AMQP.BasicProperties().builder().headers(map).build();
         //發(fā)送消息
         channel.basicPublish(EXCHANGE_HEADER, "", properties, message.getBytes("utf-8"));
         System.out.println("[發(fā)送]:" + message);
         channel.close();
         connection.close();
     }
     catch (Exception e) {
         e.printStackTrace();
     }



/**
* 消費端
*/

 private static final String QUEUE_NAME = "test.header";
 private static final String EXCHANGE_HEADER = "test_exchange_header";
     try {
         //獲取連接
         Connection connection = ConnectionUtil.getConnection();
         //從連接中獲取一個通道
         Channel channel = connection.createChannel();

         Map<String,Object> map = new HashMap<>();
         map.put("name","fzh1");
         map.put("x-match","any");

         //綁定交換機
         channel.exchangeDeclare(EXCHANGE_HEADER, BuiltinExchangeType.HEADERS);
         //聲明隊列
         channel.queueDeclare("", false, false, false, null);
         //綁定交換機
         channel.queueBind("",EXCHANGE_HEADER,"",map);

         //定義消費者
         DefaultConsumer consumer = new DefaultConsumer(channel) {
             //當(dāng)消息到達(dá)時執(zhí)行回調(diào)方法
             @Override
             public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
                                        byte[] body) throws IOException {
                 String message = new String(body, "utf-8");
                 System.out.println("[消費2]:" + message+"___"+properties.getHeaders().toString());
             }
         };
         //監(jiān)聽隊列
         channel.basicConsume(QUEUE_NAME, true, consumer);
     }
     catch (Exception  e) {
         e.printStackTrace();
     }

路由

交換機跟隊列之間的鏈接點 ,再 Direct模式 跟topic模式下 必須綁定

隊列

具體消息存儲的地方

生產(chǎn)者

發(fā)送消息端

消費者

接受消息消費

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坪仇,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屁商,死亡現(xiàn)場離奇詭異烟很,居然都是意外死亡,警方通過查閱死者的電腦和手機蜡镶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門雾袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人官还,你說我怎么就攤上這事芹橡。” “怎么了望伦?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵林说,是天一觀的道長。 經(jīng)常有香客問我屯伞,道長腿箩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任劣摇,我火速辦了婚禮珠移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己钧惧,他們只是感情好暇韧,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浓瞪,像睡著了一般懈玻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乾颁,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天涂乌,我揣著相機與錄音,去河邊找鬼钮孵。 笑死骂倘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巴席。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诅需,長吁一口氣:“原來是場噩夢啊……” “哼漾唉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堰塌,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赵刑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后场刑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般此,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年牵现,在試婚紗的時候發(fā)現(xiàn)自己被綠了铐懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞎疼,死狀恐怖科乎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贼急,我是刑警寧澤茅茂,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站太抓,受9級特大地震影響空闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜走敌,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一碴倾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦影斑、人聲如沸给赞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽片迅。三九已至,卻和暖如春皆辽,著一層夾襖步出監(jiān)牢的瞬間柑蛇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工驱闷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耻台,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓空另,卻偏偏與公主長得像盆耽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扼菠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容