現在微服務盛行, 我們通常會進行解耦, 這時候就需要非同步的訊息佇列來幫助各個服務之間解耦
rabbitmq的基本概念有訊息producer(訊息生產者)、exchange(交換機)、queue(佇列)、consumer(消費者)、routingkey
(圖中的p是producer, 即訊息生產者, 中簡的server是exchange(交換機) 和 queue(佇列))
queue是存放訊息的佇列, 實際上就是乙個存放訊息資料結構為佇列的乙個容器
我們可能會簡單的以為傳送者會把訊息傳送到佇列中, 然後消費者對佇列進行監聽。事實上, 訊息傳送者永遠不會將訊息直接傳送到佇列中, 而是將訊息傳送到exhang中, 再由exchange通過一定的路由規則路由到對應的訊息佇列中。
交換機有四種型別:
在上面介紹exchange中說到訊息通過一定的路由規則路由到對應的佇列中, routingkey就是起著這樣的乙個作用,通常我們傳送訊息到exchane中的時候會攜帶乙個routingkey, 而這個routingkey就是exchange和queue繫結的乙個規則, 由此便可以將訊息從exchange再傳送到對應的queue上
參考文章
首先新增以下依賴:
org.springframework.boot
spring-boot-starter-amqp
配置項如下:
spring:
rabbitmq:
port: 5672
password: guest
username: guest
host: localhost
listener:
******:
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
}
在上面的**中我們傳送了乙個訊息到名為"exchange1", routingkey為"exchange1-queue1"的訊息。我們啟動rabbitmq。
傳送後可以在mq上看到如下圖已經成功傳送了。
接下來貼上接受訊息的receiver**:
@component
public class receiver catch (exception e) }}
接受訊息後再看mq上如下圖:
可以看出queue1上ready一欄是0,但是unacked一欄和total一欄依然有訊息, 這是因為我們再配置檔案中設定的是手動的ack,這時候**中沒有進行ack, mq會認為消費者沒有成功消費掉這條訊息, 這時候就需要在配置檔案中設定成自動ack, 或者在**中手動進行ack,在消費者後新增如下**:
channel.basicack(message.getmessageproperties().getdeliverytag(), true);
rabbitmq的基本使用
現在微服務盛行,我們通常會進行解耦,這時候就需要非同步的訊息佇列來幫助各個服務之間解耦 rabbitmq的基本概念有訊息producer 訊息生產者 exchange 交換機 queue 佇列 consumer 消費者 routingkey 圖中的p是producer,即訊息生產者,中簡的serve...
rabbitmq基本使用
生產者 public class rabbitmqhelper port 5672 using var connection factory.createconnection using var channel connection.createmodel t.tojsonstring 消費者 cl...
RabbitMQ的基本使用到高階特性
這裡需要增加乙個使用者,並且設定使用者為administrator,更多命令可以參考rabbitmq更多命令,這裡開始我本來是想用guest使用者,埠是 15672,但是在建立連線的時候是連線不上的,查資料後發現是必須開放5672埠,並且不能使用guest預設使用者 rabbitmqctl add ...