RabbitMQ系列-6.如何通過控制臺創(chuàng)建交換機、隊列、死信隊列、延遲隊列

概述

在實際生產(chǎn)環(huán)境中,我們更推薦使用RabbitMQ后臺管理頁面創(chuàng)建交換機、隊列、聲明綁定關(guān)系、配置死信隊列、延遲隊列等
今天帶大家看看如何在RabbitMQ后臺管理頁面操作這些東西

登錄管理后臺

創(chuàng)建隊列

點擊Exchange頁簽

填寫你要創(chuàng)建的交換機參數(shù),注意選擇正確的Virtual host

在參數(shù)下方可以點擊,給你的交換機聲明備份交換機(關(guān)于備份交換機請看前面文章)

創(chuàng)建完成后效果如下:

創(chuàng)建隊列

點擊Queues頁簽

上圖中涂紅的部分我們可以指定隊列參數(shù)
例如:

創(chuàng)建后效果:

交換機與隊列綁定

對交換機和隊列進行綁定可以在Exchanges中聲明,也可以在Queues中聲明

下面以Queues中聲明為例:
點擊列表中隊列的名字,就會進入隊列詳情頁面

在這個隊列詳情頁面,我們可以指定交換機與隊列的綁定關(guān)系:

因為我聲明的是扇形交換機類型,所以我就不寫路由key了
點擊【Bind】按鈕,即可綁定成功

綁定成功后效果:

重復上述步驟,我們建立如下3個交換機和3個隊列:

總結(jié)一下:

  • kc-guideorder-exchange是我們的業(yè)務(wù)要用的交換機(fanout類型),與隊列kc-guideorder-queue綁定,并且隊列kc-guideorder-queue我們設(shè)置了消息過期時間600s,消息過期后會成為死信,將會進入我們在隊列聲明時指定的死信隊列:kc-deadletter-exchange
  • kc-deadletter-exchange同樣設(shè)計為fanout類型,它與隊列kc-deadletter-queue綁定,所以上面的死信最終會被存儲到隊列kc-deadletter-queue上
  • 同時kc-guideorder-exchange我們?yōu)樗付艘粋€備份交換機kc-guideorder-queue-ae,發(fā)送到交換機kc-guideorder-exchange失敗的信息會被轉(zhuǎn)發(fā)到這個備份交換機上,備份交換機為與kc-guideorder-queue-ae這個隊列綁定,所以消息最終會存儲在隊列kc-guideorder-queue-ae上

測試

1.延遲隊列測試

我們往kc-guideorder-exchange這個交換機發(fā)送一條消息

@RestController
public class SendDelayMessageController {

    @Autowired
    RabbitSender rabbitSender;

    @GetMapping("/sendDelayMessageAck")
    public String sendDirectMessage() {
        rabbitSender.convertAndSend("kc-guideorder-exchange", null, "Hell,我是延遲消息");
        return "ok";
    }
}

在對應(yīng)的隊列中發(fā)現(xiàn)存在此消息

等待10分鐘.....

消費端監(jiān)聽器代碼:

@RabbitListener(queues = "kc-deadletter-queue")
public void onMessage(Message message, Channel channel) throws IOException {
    System.out.println("接收到消息總體內(nèi)容:" + message);
    System.out.println("實際消息內(nèi)容:" + new String(message.getBody()));

    // TODO 業(yè)務(wù)邏輯
    // 1.獲取message中的body,解析消息內(nèi)容
    // 2.其他業(yè)務(wù)邏輯......

    // 回執(zhí)情形1:消費成功
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

    // 回執(zhí)情形2:消費成功消費處理失敗,重新放入隊列(一定要慎用,防止造成無限返回隊列->消費者->返回隊列.....造成消息積壓)
    // channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

    // 回執(zhí)情形3:消費處理失敗,拒絕接收(可以指定是否重新放入隊列,如果消息不重新放入隊列,RabbitMQ服務(wù)端會將消息移除)
    // channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
}

控制臺輸出

接收到消息總體內(nèi)容:(Body:'"Hell,我是延遲消息"' MessageProperties [headers={spring_listener_return_correlation=ed70bfd9-a258-4a3b-ba14-f95e2635223e, spring_returned_message_correlation=20201215122141164475429, x-first-death-exchange=kc-guideorder-exchange, x-death=[{reason=expired, count=1, exchange=kc-guideorder-exchange, time=Tue Dec 15 12:31:41 CST 2020, routing-keys=[], queue=kc-guideorder-queue}], x-first-death-reason=expired, x-first-death-queue=kc-guideorder-queue, __TypeId__=java.lang.String}, contentType=application/json, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=kc-deadletter-exchange, receivedRoutingKey=, deliveryTag=1, consumerTag=amq.ctag-1lY9szRg4nFzYEvxFG-AHQ, consumerQueue=kc-deadletter-queue])
實際消息內(nèi)容:"Hell,我是延遲消息"

2.備份交換機測試

為了測試備份交換機是否生效,我們先把kc-guideorder-exchange與隊列kc-guideorder-queue進行解綁,這樣發(fā)送到kc-guideorder-exchange的消息是找不到對應(yīng)的隊列的,測試其是否能為我們將消息轉(zhuǎn)發(fā)到備份交換機上

我們再發(fā)送一條消息

然后查看備份交換機隊列:

發(fā)現(xiàn)此隊列已經(jīng)存在一條消息

實際生產(chǎn)環(huán)境,我們可以消費此隊列做通知、或者其他補償措施

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容