摘要:事實上,消息發送者永遠不會將消息直接發送到隊列中,而是將消息發送到中,再由通過一定的路由規則路由到對應的消息隊列中。
現在微服務盛行, 我們通常會進行解耦, 這時候就需要異步的消息隊列來幫助各個服務之間解耦
rabbitmq的基本概念介紹rabbitmq的基本概念有消息producer(消息生產者)、exchange(交換機)、queue(隊列)、consumer(消費者)、routingKey
(圖中的P是producer, 即消息生產者, 中簡的Server是Exchange(交換機) 和 Queue(隊列))
Queue(隊列)
queue是存放消息的隊列, 實際上就是一個存放消息數據結構為隊列的一個容器
exchange(交換機)
我們可能會簡單的以為發送者會把消息發送到隊列中, 然后消費者對隊列進行監聽。事實上, 消息發送者永遠不會將消息直接發送到隊列中, 而是將消息發送到exhang中, 再由exchange通過一定的路由規則路由到對應的消息隊列中。
交換機有四種類型:
Direct Topic Headers Fanout Direct Exchange:
routingKey
在上面介紹exchange中說到消息通過一定的路由規則路由到對應的隊列中, routingKey就是起著這樣的一個作用,通常我們發送消息到exchane中的時候會攜帶一個routingKey, 而這個routingKey就是exchange和queue綁定的一個規則, 由此便可以將消息從exchange再發送到對應的queue上
參考文章https://segmentfault.com/a/11...
SpringBoot中使用rabbitmq首先添加以下依賴:
org.springframework.boot spring-boot-starter-amqp
配置項如下:
spring: rabbitmq: port: 5672 password: guest username: guest host: localhost listener: simple: acknowledge-mode: manual concurrency: 1 max-concurrency: 1 retry: enabled: true
在瀏覽器輸入http://localhost:15672/, 在mq上我們新建了一個名為exchange1, routingKey為exhcange1-queue1的exchange, 并且映射到名為queue1的隊列,
發送消息代碼Prodcuer:
public class Sender{ @Autowired private RabbitTemplate rabbitTemplate; public void send(Object object) { CorrelationData correlationData = new CorrelationData(); correlationData.setId("exchange1-queue1-id"); String message = "hello world"; rabbitTemplate.convertAndSend("exchange1", "exchange1-queue1", "helloworld", new CorrelationData()); } }
在上面的代碼中我們發送了一個消息到名為"exchange1", routingKey為"exchange1-queue1"的消息。我們啟動rabbitmq。
發送后可以在mq上看到如下圖已經成功發送了。
接下來貼上接受消息的receiver代碼:
@Component public class Receiver { @RabbitListener(queues = "queue1") public void receive(Message message, Channel channel) { try { System.out.println(message.getBody()); } catch (Exception e) { e.printStackTrace(); } } }
接受消息后再看mq上如下圖:
可以看出queue1上Ready一欄是0,但是Unacked一欄和Total一欄依然有消息, 這是因為我們再配置文件中設置的是手動的ack,這時候代碼中沒有進行ack, mq會認為消費者沒有成功消費掉這條消息, 這時候就需要在配置文件中設置成自動ack, 或者在代碼中手動進行ack,在消費者后添加如下代碼:
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73258.html
摘要:進行插入操作的端稱為隊尾,進行刪除操作的端稱為對頭。還有個專業術語要了解下生產者發送消息的應用程序被稱為生產者。消費者接收消息的應用程序被稱為消費者。參考鏈接下安裝及操作常用命令譯實戰教程一你是否聽說過或者使用過隊列? 你是否聽說過或者使用過消息隊列? 你是否聽說過或者使用過RabbitMQ? 提到這幾個詞,用過的人,也許覺得很簡單,沒用過的人,也許覺得很復雜,至少在我沒使用消息隊列之前,聽...
摘要:安裝步驟整體軟件環境軟件版本語言安裝離線安裝是使用這種編程語言開發的,所以安裝的前提是安裝語言。這次全都是離線安裝,以便在遠離的生產環境部署。 安裝步驟 整體軟件環境 |軟件|版本||-|-||RHEL |7 update3||Erlong|19.3||rabbitMQ|3.6.10| Erlong語言安裝離線安裝 rabbitMQ是使用erlang這種編程語言開發的,所以安裝rabb...
摘要:可以在地址看到如何使用講解下上面命令行表示控制臺端口號,可以在瀏覽器中通過控制臺來執行的相關操作。同時從控制臺可以看到發送的速率多線程測試性能開了個線程,每個線程發送條消息。 showImg(http://ww2.sinaimg.cn/large/006tNc79ly1g5jjb62t88j30u00gwdi2.jpg); 前提 上次寫了篇文章,《SpringBoot Kafka 整合...
摘要:在發送后端監聽聲明的排他隊列,當收到消息后比對正確則處理消息斷開監聽連接,然后此隊列被系統自動回收。并且通過也看到了這條消息的返回。此時我們基本已經將問題鎖定在端了。 背景 公司的一個項目使用rabbitmq作為broker進行交互,并且數據的查詢方法使用RPC模式,RPC Client端使用java編寫并使用springAMQP包與rabbitmq交互,在RPC Server端使用p...
閱讀 2415·2021-09-01 10:41
閱讀 1440·2019-08-30 14:12
閱讀 507·2019-08-29 12:32
閱讀 2856·2019-08-29 12:25
閱讀 2934·2019-08-28 18:30
閱讀 1704·2019-08-26 11:47
閱讀 973·2019-08-26 10:35
閱讀 2588·2019-08-23 18:06