springboot整合rabbitmq及使用方法

2021-08-24 23:11:37 字數 4244 閱讀 1561

首先說一下交換機.交換機的主要作用是接收相應的訊息並且繫結到指定的佇列.交換機有四種型別,分別為direct,topic,headers,fanout.

direct是rabbitmq預設的交換機模式,也是最簡單的模式.即建立訊息佇列的時候,指定乙個bindingkey.當傳送者傳送訊息的時候,指定對應的key.當key和訊息佇列的bindingkey一致的時候,訊息將會被傳送到該訊息佇列中.

topic**資訊主要是依據萬用字元,佇列和交換機的繫結主要是依據一種模式(萬用字元+字串),而當傳送訊息的時候,只有指定的key和該模式相匹配的時候,訊息才會被傳送到該訊息佇列中.

headers也是根據乙個規則進行匹配,在訊息佇列和交換機繫結的時候會指定一組鍵值對規則,而傳送訊息的時候也會指定一組鍵值對規則,當兩組鍵值對規則相匹配的時候,訊息會被傳送到匹配的訊息佇列中.

fanout是路由廣播的形式,將會把訊息發給繫結它的全部佇列,即便設定了key,也會被忽略.

二.springboot整合rabbitmq(direct模式)

springboot整合rabbitmq非常簡單!感覺springboot真的極大簡化了開發的搭建環境的時間..這樣我們程式設計師就可以把更多的時間用在業務上了,下面開始搭建環境:

配置pom.xml檔案,注意其中用到了springboot對於amqp(高階訊息佇列協議,即面向訊息的中介軟體的設計)

org.springframework.boot

spring-boot-starter-amqp

spring:

name: rabbitmq

rabbitmq:

host: *******ip位址*******

port: 5672

username: guest

password: guest

隨後,配置queue(訊息佇列).那注意由於採用的是direct模式,需要在配置queue的時候,指定乙個鍵,使其和交換機繫結.

@configuration

public class senderconf

}

接著就可以傳送訊息啦!在springboot中,我們使用amqptemplate去傳送訊息!**如下:

@component

public class hellosender

}

編寫測試類!這樣我們的傳送端**就編寫完了~

@runwith(springjunit4classrunner.class)

public class testrabbitmq

}

@component

public class helloreceive

}

接下來就可以測試啦,首先啟動接收端的應用,緊接著執行傳送端的單元測試,接收端應用列印出來接收到的訊息,測試即成功!

需要注意的地方,direct模式相當於一對一模式,乙個訊息被傳送者傳送後,會被**到乙個繫結的訊息佇列中,然後被乙個接收者接收!

實際上rabbitmq還可以支援傳送物件:當然由於涉及到序列化和反序列化,該物件要實現serilizable介面.hellosender做出如下改寫:

public void send()
helloreceiver做出如下改寫:

@rabbitlistener(queues="queue")    //***監聽指定的queue

public void process1(user user)

三.springboot整合rabbitmq(topic**模式)

首先我們看傳送端,我們需要配置佇列queue,再配置交換機(exchange),再把佇列按照相應的規則繫結到交換機上:

@configuration

public class senderconf

@bean(name="messages")

public queue queuemessages()

@bean

public topicexchange exchange()

@bean

binding bindingexchangemessage(@qualifier("message") queue queuemessage, topicexchange exchange)

@bean

binding bindingexchangemessages(@qualifier("messages") queue queuemessages, topicexchange exchange)

}

而在接收端,我們配置兩個***,分別監聽不同的佇列:

@rabbitlistener(queues="topic.message")    //***監聽指定的queue

public void process1(string str)

@rabbitlistener(queues="topic.messages") //***監聽指定的queue

public void process2(string str)

好啦!接著我們可以進行測試了!首先我們傳送如下內容:

template.convertandsend("exchange","topic.message","hello,rabbit!");
方法的第乙個引數是交換機名稱,第二個引數是傳送的key,第三個引數是內容,rabbitmq將會根據第二個引數去尋找有沒有匹配此規則的佇列,如果有,則把訊息給它,如果有不止乙個,則把訊息分發給匹配的佇列(每個佇列都有訊息!),顯然在我們的測試中,引數2匹配了兩個佇列,因此訊息將會被發放到這兩個佇列中,而監聽這兩個佇列的***都將收到訊息!那麼如果把引數2改為topic.messages呢?顯然只會匹配到乙個佇列,那麼process2方法對應的***收到訊息!

四.springboot整合rabbitmq(fanout exchange形式)

那前面已經介紹過了,fanout exchange形式又叫廣播形式,因此我們傳送到路由器的訊息會使得繫結到該路由器的每乙個queue接收到訊息,這個時候就算指定了key,或者規則(即上文中convertandsend方法的引數2),也會被忽略!那麼直接上**,傳送端配置如下:

@configuration

public class senderconf

@bean(name="bmessage")

public queue bmessage()

@bean(name="cmessage")

public queue cmessage()

@bean

fanoutexchange fanoutexchange()

@bean

binding bindingexchangea(@qualifier("amessage") queue amessage,fanoutexchange fanoutexchange)

@bean

binding bindingexchangeb(@qualifier("bmessage") queue bmessage, fanoutexchange fanoutexchange)

@bean

binding bindingexchangec(@qualifier("cmessage") queue cmessage, fanoutexchange fanoutexchange)

}

傳送端使用如下**傳送:

template.convertandsend("fanoutexchange","","hello,rabbit!");//引數2獎盃忽略
接收端***配置如下:

@component

public class helloreceive

@rabbitlistener(queues="fanout.b")

public void processb(string str)

@rabbitlistener(queues="fanout.c")

public void processc(string str)

}

執行測試**,發現三個***都接收到了資料,測試成功!

SpringBoot使用訊息中介軟體RabbitMQ

首先在docker中安裝rabbitmq,pull 帶有web介面的 docker pull rabbitmq 3 management5672為客戶端,15672為web介面埠 docker run d p5672 5672 p15672 15672 name rabbitmq01 映象id簡要介...

springBoot整合dubbo整合專案

傳統spring 整合dubbo,需要繁瑣的編寫一堆堆的 xml 配置檔案 而springboot整合dubbo後,不在需要寫 xml,通過jar包引用,完 成整合,通過註解的形式完成配置。提高我們的開發效率 目錄結構 1 服務層生產者開發 hs ldm server service 1.1新增du...

SpringBoot整合系列 整合Swagger2

io.springfox springfox swagger2 2.7.0 io.springfox springfox swagger ui 2.7.0 一般無配置項,必要時可以新增自定義配置項,在配置類中讀取 swagger2的配置內容僅僅就是需要建立乙個docket例項 configurati...