1. 程式人生 > >帶著新人學springboot的應用07(springboot+RabbitMQ 下)

帶著新人學springboot的應用07(springboot+RabbitMQ 下)

  說一兩句廢話,強烈推薦各位小夥伴空閒時候也可以寫寫自己的部落格!不管水平高低,不管寫的怎麼樣,不要覺得寫不好或者水平不夠就不寫了(咳,我以前就是這樣的想法。。。自我反省!)。

  但是開始寫部落格之後,你會發現很多你以為自己會的東西其實你並不會,然後你會經常在頭腦中不斷的搜尋有關的片段,或者去別的大神部落格裡到處找有關的資料,最後領悟了屬於自己的東西!然後再寫出來和別人分享,別人也會給你點意見,你也會慢慢的改進。這不就是學習+複習+鞏固+創新+分享+改進的這麼的一個過程嗎?

  以前看過曹雪芹的紅樓夢,讓我印象最深刻的就是開篇第一回兩句詩:“都雲作者痴,誰解其中味?”

  自從寫部落格之後,我信了一句話:寫部落格的好處誰寫誰知道!

  嘿嘿嘿,又在瞎說廢話了,迴歸正題。

  上一節手動實現了RabbitMQ,要自己去點點點建立交換器、佇列,然後還要慢慢的繫結,那,能不能用程式去實現啊! 然後程式自己監聽,比如有一個監聽器直接監聽animal佇列,只要有訊息丟到animal佇列中,監聽器就會直接從佇列中取資料放到java程式碼中,反序列化成一個物件,然後我們就能快樂的使用這個物件了。

  這一節我們就用springboot簡單整合RabbitMQ,看看到底怎麼用。

 

1.搭建環境

  建立一個springboot專案,RabbitMQ+WEB+版本1.5.17

 

2.RabbitMQ的簡單測試(視覺化+程式碼結合使用)

   注意,這裡程式碼內部匯入的很多類一定要是amqp包下的

   還記得上節最後說了一個xxxTemplate嗎?這個模板就是RabbitTemplate,這個模板建立起來java程式操作RabbitMQ的橋樑,就像電視機和遙控器之間的關係。

  我先來說一種簡單的方式,就是交換器和佇列我們用視覺化頁面去建立,用滑鼠點點點,跟上一節一樣,然後我們只需要傳送資訊和設定監聽取訊息就ok了。

  這是我上一節建立的交換器和佇列,都繫結好了,這個就不多說了,上一節說的很清楚了

 

  在springboot的配置檔案中配置

 

   在主配置類開啟RabbitMQ訊息中介軟體

 

 

  隨便寫個類,註解用@Component或者@Service行, 最重要的是@RabbitListener註解,這個註解就相當於一個監聽器,會一直監聽指定佇列的情況,只要這佇列有什麼異動,就會跑過去拿訊息放到方法形參內。

 

  用一個測試方法,模擬使用者,我這裡是往direct交換器發訊息,RoutingKey為animal,最終應該是將訊息發給了animal佇列,然後被監聽器監聽,將訊息放入形參Message中。

 

  好了,配置完成,可以使用了。

  其中要注意RabbitTemplate模板的使用方法(這個模板可以自動注入,原理後面大概看一下),自己可以查查資料, 可以自己試試每個方法。

  然後先執行springboot應用,沒輸出;

  執行測試方法模擬使用者向RabbitMQ發訊息,控制檯列印訊息,成功。

 

  上面MyService中的方法形參是Message(試試Map行不行啊,我沒試過...),但是有的時候用物件比較方便,於是我們可以測試用物件接受資料

 

  執行後結果為:

 

  由此可見,可以直接從RabbitMQ中反序列化出物件。所以從佇列中取出訊息,你可以直接誒用Message物件,好處是可以不用在意資料的型別,你還可以取到訊息頭的一些資訊,但是你得到資料還需要進一步處理才能變成物件。

  當然,如果你知道佇列中資料的型別的話你可以直接用該類去接收資料,這樣比較方便,後續用起來可以直接用。

  

3.用程式碼建立交換器和佇列

  上面大概就介紹完了RabbitMQ的基本用法,但是就有的人說用視覺化工具多lower啊,我是高手,我就要用程式碼建立交換器和佇列,並且進行繫結。

  其實有時候還真有這樣的需求,需要用程式碼臨時建立一個交換器和佇列,所以無論是為了體現出自己水平高深還是為了滿足一些需求,我們都要學會用java程式碼實現建立交換器和佇列,並進行繫結。

  下面我們就來試試建立一個direct型別的交換器,名字叫"java-direct",再建立一個叫”java.queue“的佇列,然後將這兩個繫結,BindingKey為”java.queue“。

  我們會用到一個類amqpAdmin,這個類看名字就知道是個很了不得的類,這個就相當於RabbitMQ管理員的角色。可以刪除和建立RabbitMQ裡的元件,declarexxx是建立元件,deletexxx是刪除元件

  其中,druable表示持久化(這裡我設定佇列持久化),arguement表示一些訊息頭引數,是一個map,用到的時候再看吧!

 

  然後執行這個測試方法,開啟RabbitMQ視覺化工具,可以看到如下結果:

   後面的用法我就不用多說了,和上面一樣,該監聽監聽,該怎麼做就怎麼做,不過可以試試指定其他的key測試測試啊!

 

4.訊息轉化器

   還記得radis中的那個存到redis中的資料,我們看不懂嗎?這也就是所謂的亂碼,因為預設用jdk序列化的嘛!

  在RabbitMQ中也有類似的情況,假如我們RabbitMQ中的佇列中訊息由於某種原因卡住了,我們要用視覺化工具看看這些資料是些什麼鬼,但是我們看到的是下圖這樣的:

  注:這裡佇列中資料我用的是map,才能看到亂碼!如果用物件,這裡什麼也看不到。

 

  這是因為那個RabbitTemplate預設發訊息會用一個訊息轉換器,把我們要傳送的訊息換一種形態,但是這種形態不利於我們觀察,於是我們就自己定義一個訊息轉換器,轉成json形態,我們在視覺化工具裡就看得懂了。

 

  然後我們看看視覺化裡的資料(這個時候map和物件都行,我用物件測試):

 

5.大概看看RabbitMQ的自動配置類

   其實原理沒什麼好說的,和以前的套路一樣,找自動配置類。

  對了,很多小夥伴用springboot每整合一個新框架的時候,你要看一下這個新框架的基本配置,應該要知道首先就去對應的自動配置類裡面找吧!

  但是,也有很多人可能會說:特麼的,這麼多自動配置類,我怎麼知道去哪裡找啊,再說了,這個類名字這麼長,我也記不住啊!

  那我稍微提一下就以我們這個RabbitMQ為例:首先我們匯入了RabbitMQ依賴,我們就能在jar包那裡找到RabbitMQ或者amqp相關的東西(大家應該知道amqp和RabbitMQ之間的關係吧!其實就類似介面和實現類的關係)------------->然而並沒有找到spring.factories檔案,說明自動配置類應該是springboot自己就有的,我們可以到那個自動配置類的spring.factories中去看看

 

 或者你也可以去下圖這個路徑看看(習慣了你都不用這樣找,直接ctrl+N,然後查詢“新框架的名字+AutoConfiguration”,大概就能找到)

 

   自動配置類就找到了,一般自動配置類都會跟xxxProperties類放在一起,方便我們在配置檔案控制引數,所以想要看看所有的能在配置檔案配的引數,直接開啟這個xxxProperties類,看看有什麼屬性就ok了。

 

   然後開啟自動配置類,看到這裡

  

  也可以開啟RabbitTemplate,看看預設訊息轉換器是哪個,用什麼規則去序列化訊息的。

  

  點進去看看具體的序列化規則

 

  這個訊息轉換器其實也就是這樣,我們再來繼續看看自動配置類裡面

 

  不多說了,大概的看看就夠了,訊息中介軟體之RabbitMQ就說這麼多東西吧!給新手一個入門,也許其中很多東西說的不準確啊,那也沒辦法,我水平就這樣啊。。。不過很多細節還是要自己多練習啊,試試那個RabbitTemplate模板的很多方法,AmqpAdmin也有很多的方法;訊息轉換器的一些知識還需要自己去查查啊。。。。

  咳,突然越寫就越覺得還有很多東西都沒說,很多細節問題!就這樣吧,下一節我看看能說點什麼新的東西。。