国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

rabbitmq消息異常處理

這篇具有很好參考價值的文章主要介紹了rabbitmq消息異常處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔


前言

在使用rabbitmq時,會因為各種原因(網(wǎng)絡波動,系統(tǒng)宕機,程序異常等)導致消息發(fā)送失敗。rabbitmq也提供了相應的處理機制。


提示:以下是本篇文章正文內容,下面案例可供參考

一、rabbitmq消息發(fā)送失敗處理機制

生產(chǎn)法發(fā)送失敗
配置回調器。
yml配置開啟確認和返回機制
confirm:發(fā)送給exchange時的回調,不管是否成功發(fā)送給隊列。
return:消息沒有發(fā)送給exchange時的回調。

#成功發(fā)送到exchange時的回調
spring.rabbitmq.publisher-confirm-type=correlated
#exchange未發(fā)送到隊列時回調
spring.rabbitmq.publisher-returns=true

回調函數(shù)配置方式

@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {
    /**
     * 交換機不管是否收到消息的一個回調方法
     *
     * @param correlationData 消息相關數(shù)據(jù)
     * @param ack             交換機是否收到消息
     * @param cause           未收到消息的原因
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        String id = correlationData != null ? correlationData.getId() : "";
        if (ack) {
            log.info("交換機已經(jīng)收到 id 為:{}的消息", id);
        } else {
        //重發(fā)處理,可以入庫,死信隊列處理....
            log.info("交換機還未收到 id 為:{}消息,原因:{}", id, cause);
        }
    }

    //當消息無法路由的時候觸發(fā)回調方法
    @Override
    public void returnedMessage(ReturnedMessage returned) {
         //重發(fā)處理,可以入庫,死信隊列處理....
        log.error("消息:{},被交換機 {} 退回,原因:{},路由key:{},code:{}",
                new String(returned.getMessage().getBody()), returned.getExchange(),
                returned.getReplyText(), returned.getRoutingKey(),
                returned.getReplyCode());

    }
}

rabbitmqTemplate在啟動時注入:

@Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RabbitTemplate.ConfirmCallback confirmCallback;
    @Autowired
    private RabbitTemplate.ReturnsCallback returnsCallback;
    //依賴注入 rabbitTemplate 之后再設置它的回調對象
    @PostConstruct
    public void init() {
        rabbitTemplate.setConfirmCallback(confirmCallback);
        rabbitTemplate.setReturnsCallback(returnsCallback);
    }

消費者消費失敗后處理
通過自動ack+retry配置+私信隊列方式實現(xiàn)

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
#        acknowledge-mode: manual   # 配置該消費者的ack方式為手動
        acknowledge-mode: auto   # 配置該消費者的ack方式為自動
        default-requeue-rejected: false
        #設置消費失敗后重發(fā)
        retry:
          #重發(fā)次數(shù)
          max-attempts: 3
          #開啟重發(fā)
          enabled: true
          # 重試間隔(ms)
          initial-interval: 5000

@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = QUEUE_NAME1, durable = “true”, autoDelete = “false”,
arguments = {@Argument(name = “x-dead-letter-exchange”, value = “dead-exchange”),
@Argument(name = “x-dead-letter-routing-key”, value = “dead-routing-key”),
@Argument(name = “x-message-ttl”, value = “1000”,type = “java.lang.Long”)
}),
exchange = @Exchange(value = “first_exchange”, type = ExchangeTypes.DIRECT),
key = “queue_one_key1”))
public void handleMessage1(Message message, Channel channel) throws IOException {
log.info(“OrderConsumer handleMessage {} , error:”, message);
//模擬消費異常,自動進入私信隊列
throw new RuntimeException(“拋出異常,模擬消費失敗,觸發(fā)spring-retry”);
}

/**
 * 死信隊列消費者
 *
 * @param data
 * @param channel
 * @throws Exception
 */
@RabbitListener(queues = "dead-queue")
public void consumeDL(String data, Channel channel) throws Exception {
    //處理消費失敗的消息
    log.info(">>>> 死信隊列消費 tag = {},消息內容 : {}", data);

// channel.basicNack(tag, false, false);
}

通過手動ack+私信隊列實現(xiàn)(不要配置retry!!!)

spring.rabbitmq.publisher-returns=true
spring.rabbitmq.listener.simple.acknowledge-mode=manual
    @RabbitListener(queues = CONFIRM_QUEUE_NAME)
    public void receiveMsg(String data, Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody());
        log.info("接受到隊列 confirm.queue 消息:{}", msg);
//        throw new RuntimeException("拋出異常,模擬消費失敗,觸發(fā)spring-retry");
        //模擬消費失敗,重發(fā)n次后仍然失敗。調用basicNack 拋給私信隊列處理
        channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,false);
    }
 //接收消息
    @RabbitListener(queues = "QD")
    public void receiveD(Message message, Channel channel) throws IOException {
        String msg = new String(message.getBody());
        log.info("當前時間:{},收到死信隊列信息{}", new Date().toString(), msg);
    }

總結

rabbitmq消息失敗處理需要謹慎對待,因為容易產(chǎn)生資源消耗殆盡的問題?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-406881.html

到了這里,關于rabbitmq消息異常處理的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • RabbitMQ怎么處理消息事務

    在 RabbitMQ 中,可以通過以下兩種方式實現(xiàn)消息事務: 發(fā)送方確認(Publisher Confirms) :這是 RabbitMQ 提供的一種輕量級事務機制。在發(fā)送消息之前,發(fā)送方可以要求 RabbitMQ 確認消息是否成功投遞到交換機(Exchange)中。如果確認失敗,發(fā)送方可以選擇重試或者處理發(fā)送失敗的情

    2024年02月07日
    瀏覽(24)
  • RabbitMQ消息堆積方案處理

    在消息隊列中,消息堆積是生產(chǎn)環(huán)境中的需要考慮的問題,一旦消息產(chǎn)生積壓,來不及消費,可能會導致MQ服務器宕機,而解決消息積壓有這樣一些方案解決: 1.增加消費者數(shù)量 可以根據(jù)業(yè)務情況適當添加多臺服務器部署消費者服務實例,消費者數(shù)量增加,可以有效提高消息

    2024年02月11日
    瀏覽(22)
  • Android應用集成RabbitMQ消息處理指南

    Android應用集成RabbitMQ消息處理指南

    RabbitMQ官網(wǎng)直通車 — ?????? ???????最近工作繁忙,好久沒有更新博文了。 ???????對于互聯(lián)網(wǎng)飽和的今天, 如何做到不同系統(tǒng)之間傳遞信息與通信? 在實際項目中,多個端例如:ios、android、pc、小程序采用從RabbitMQ上獲取實時包消息,然后根據(jù)此實時包消息來

    2024年02月06日
    瀏覽(34)
  • 優(yōu)雅地處理RabbitMQ中的消息丟失

    優(yōu)雅地處理RabbitMQ中的消息丟失

    目錄 一、異常處理 二、消息重試機制 三、錯誤日志記錄 四、死信隊列 五、監(jiān)控與告警 優(yōu)雅地處理RabbitMQ中的消息丟失對于構建可靠的消息系統(tǒng)至關重要。下面將介紹一些優(yōu)雅處理消息丟失的方案,包括異常處理、重試機制、錯誤日志記錄、死信隊列和監(jiān)控告警等。 一、異

    2024年02月13日
    瀏覽(18)
  • [ RabbitMQ 消息隊列來處理高并發(fā)場景 ]

    目錄 首先,需要創(chuàng)建一個 RabbitMQ 的連接和消息通道。 然后,需要創(chuàng)建一個生產(chǎn)者來發(fā)送消息到消息隊列。 最后,需要創(chuàng)建一個消費者來消費消息隊列中的消息。 RabbitMQ 消息隊列可以提高代碼執(zhí)行性能,主要體現(xiàn)在以下幾個方面: ?RabbitMQ 實現(xiàn)保持消息一致性的demo 在上面的

    2024年02月16日
    瀏覽(16)
  • SpringBoot 整合RabbitMq 自定義消息監(jiān)聽容器來實現(xiàn)消息批量處理

    SpringBoot 整合RabbitMq 自定義消息監(jiān)聽容器來實現(xiàn)消息批量處理

    RabbitMQ是一種常用的消息隊列,Spring Boot對其進行了深度的整合,可以快速地實現(xiàn)消息的發(fā)送和接收。在RabbitMQ中,消息的發(fā)送和接收都是異步的,因此需要使用監(jiān)聽器來監(jiān)聽消息的到來。Spring Boot中提供了默認的監(jiān)聽器容器,但是有時候我們需要自定義監(jiān)聽器容器,來滿足一

    2024年02月16日
    瀏覽(17)
  • 學會RabbitMQ的延遲隊列,提高消息處理效率

    學會RabbitMQ的延遲隊列,提高消息處理效率

    手把手教你,本地RabbitMQ服務搭建(windows) 消息隊列選型——為什么選擇RabbitMQ RabbitMQ靈活運用,怎么理解五種消息模型 RabbitMQ 能保證消息可靠性嗎 推或拉? RabbitMQ 消費模式該如何選擇 死信是什么,如何運用RabbitMQ的死信機制? 真的好用嗎?鮮有人提的 RabbitMQ-RPC模式 前面

    2024年02月14日
    瀏覽(21)
  • Python 和 RabbitMQ 進行消息傳遞和處理

    Python 和 RabbitMQ 進行消息傳遞和處理

    RabbitMQ 是一個開源的消息代理軟件,它實現(xiàn)了高級消息隊列協(xié)議(AMQP)標準。它的官方客戶端提供了多種編程語言的接口,包括 Python、Java 和 Ruby 等。它支持消息的持久化、多種交換機類型、消息通知機制、靈活的路由和安全機制等。 RabbitMQ 是由三部分組成的:生產(chǎn)者、代

    2024年02月15日
    瀏覽(13)
  • adb遠程連接手機,提示異常拒絕處理辦法

    adb遠程連接手機,提示異常拒絕處理辦法

    解決辦法: 1、手機依次打開開發(fā)者人員選項、USB調試、僅充電模式下允許ADB調試,然后用USB線把手機和電腦連起來 2、進入adb命令行,輸入adb devices 3、輸入adb tcpip 5555(這個是從usb模式切換到無線連接,后面的5555為端口) 4、再次輸入adb命令進行連接 adb connect 192.168.232.89:5

    2024年02月04日
    瀏覽(21)
  • RabbitMQ系列(19)--實現(xiàn)在RabbitMQ宕機的情況下對消息進行處理

    RabbitMQ系列(19)--實現(xiàn)在RabbitMQ宕機的情況下對消息進行處理

    前言:在生產(chǎn)環(huán)境中由于一些不明原因,導致RabbitMQ重啟的情況下,在RabbitMQ重啟期間生產(chǎn)者投遞消息失敗,生產(chǎn)者發(fā)送的消息會丟失,那這時候就需要去想在極端的情況下,RabbitMQ集群不可用的時候,如果去處理投遞失敗的消息。 1、在config包里新建一個名為ConfirmConfig的類用

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包