最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RabbitMq報(bào)錯reply-code=406 reply-text=PRECONDITION_FAILED解決

 更新時間:2022年12月26日 11:29:05   作者:刨紅薯的小羊竿爾  
這篇文章主要為大家介紹了RabbitMq報(bào)錯reply-code=406 reply-text=PRECONDITION_FAILED分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、檢查配置是否正確

今天看生產(chǎn)日志發(fā)現(xiàn)了很多的RabbitMq報(bào)錯:reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80,全都是異常之后重復(fù)消費(fèi),重復(fù)報(bào)錯。

unknown delivery tag 1-參考rabbitMQ的tag機(jī)制可知這條消息已經(jīng)完成了消費(fèi);那么出現(xiàn)這個原因是配置不對了。

首先排查SimpleRabbitListenerContainerFactory是否加上手動ack

private SimpleRabbitListenerContainerFactory getSimpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    //使用jackson進(jìn)行消息序列與反序列
    factory.setMessageConverter(new Jackson2JsonMessageConverter());
    factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 開啟手動 ack
    return factory;
}

Jackson2JsonMessageConverter是rabbitmq 對java對象json序列化的支持,在發(fā)送消息時,會先將自定義的消息類序列化成json格式,再轉(zhuǎn)成byte構(gòu)造 Message,rabbitmq的ack就被設(shè)置為自動提交;需要手動開啟ack,沒得問題:factory.setAcknowledgeMode(AcknowledgeMode.MANUAL)。

其次檢查配置文件,配置文件設(shè)置為手動ack

spring.rabbitmq.listener.direct.acknowledge-mode=manual

rabbitmq:
  host: 127.0.0.1
  port: 5672
  username: guest
  password: guest
  ###開啟消息確認(rèn)機(jī)制 confirms
  virtual-host: /
  publisher-confirms: true
  publisher-returns: true
  #rabbitmq配置加上手動應(yīng)答
  listener:
      simple:
        acknowledge-mode: manual

二、rabbitmq消息重回隊(duì)列,回到隊(duì)尾

當(dāng)出現(xiàn)異常時,我們需要把這個消息回滾到消息隊(duì)列,有兩種方式:

  • ack返回false,并重新回到隊(duì)列channel.basicNack channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
  • 拒絕消息channel.basicReject channel.basicReject(message.getMessageProperties().getDeliveryTag(), true)

但是環(huán)境中的實(shí)際情況是,當(dāng)消息回滾到消息隊(duì)列時,這條消息不會回到隊(duì)列尾部,而是仍是在隊(duì)列頭部,這時消費(fèi)者會立馬又接收到這條消息進(jìn)行處理,接著拋出異常,進(jìn)行回滾,如此反復(fù)進(jìn)行。這種情況會導(dǎo)致消息隊(duì)列處理出現(xiàn)阻塞,消息堆積,導(dǎo)致正常消息也無法消費(fèi)

對于消息回滾到消息隊(duì)列,我們希望方式是出現(xiàn)異常的消息到達(dá)消息隊(duì)列尾部,這樣既保證消息不會丟失,又保證了正常業(yè)務(wù)的進(jìn)行。

因此我們采取的解決方案是,將消息先進(jìn)行應(yīng)答,這時消息隊(duì)列會刪除該消息,同時再次發(fā)送該消息到消息隊(duì)列,這時就實(shí)現(xiàn)了錯誤消息進(jìn)行消息隊(duì)列尾部的方案。

具體方案為:

//手動進(jìn)行應(yīng)答
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//重新發(fā)送消息到隊(duì)尾
channel.basicPublish(message.getMessageProperties().getReceivedExchange(),
message.getMessageProperties().getReceivedRoutingKey(), MessageProperties.PERSISTENT_TEXT_PLAIN,
JSON.toJSONBytes(new Object()));

三、消息體本身有誤

如果一個消息體本身有誤,會導(dǎo)致該消息體,一直無法進(jìn)行處理,而服務(wù)器中刷出大量無用日志

解決這個問題可以采取兩種方案:

1、對于日常細(xì)致處理,分清哪些是可以恢復(fù)的異常,哪些是不可以恢復(fù)的異常。對于可以恢復(fù)的異常我們采取第三條中的解決方案,對于不可以處理的異常,我們采用記錄日志,直接丟棄該消息方案。

2、對每條消息進(jìn)行標(biāo)記,記錄每條消息的處理次數(shù),當(dāng)一條消息,多次處理仍不能成功時,處理次數(shù)到達(dá)我們設(shè)置的值時,我們就丟棄該消息,但需要記錄詳細(xì)的日志。

消息監(jiān)聽內(nèi)的異常處理有兩種方式:

1、內(nèi)部catch后直接處理,然后使用channel對消息進(jìn)行確認(rèn)

2、配置RepublishMessageRecoverer將處理異常的消息發(fā)送到指定隊(duì)列專門處理或記錄。監(jiān)聽的方法內(nèi)拋出異常貌似沒有太大用處。因?yàn)閽伋霎惓>退闶侵卦囈卜浅S锌赡軙^續(xù)出現(xiàn)異常,當(dāng)重試次數(shù)完了之后消息就只有重啟應(yīng)用才能接收到了,很有可能導(dǎo)致消息消費(fèi)不及時。當(dāng)然可以配置RepublishMessageRecoverer來解決,但是萬一RepublishMessageRecoverer發(fā)送失敗了呢。那就可能造成消息消費(fèi)不及時了。所以即使需要將處理出現(xiàn)異常的消息統(tǒng)一放到另外隊(duì)列去處理,個人建議兩種方式:

  • catch異常后,手動發(fā)送到指定隊(duì)列,然后使用channel給rabbitmq確認(rèn)消息已消費(fèi)
  • 給Queue綁定死信隊(duì)列,使用nack(requque為false)確認(rèn)消息消費(fèi)失敗

以上就是RabbitMq報(bào)錯reply-code=406 reply-text=PRECONDITION_FAILED解決的詳細(xì)內(nèi)容,更多關(guān)于RabbitMq reply報(bào)錯解決的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解

    這篇文章主要介紹了JavaWeb中的文件上傳和下載功能的實(shí)現(xiàn),在開發(fā)中,文件上傳和下載功能是非常常用的功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 詳解Java線程池的使用(7種創(chuàng)建方法)

    詳解Java線程池的使用(7種創(chuàng)建方法)

    這篇文章主要介紹了詳解Java線程池的使用(7種創(chuàng)建方法),線程池的創(chuàng)建?式總共包含7種,其中6種是通過Executors創(chuàng)建的,1種是通過ThreadPoolExecutor創(chuàng)建的,今天我們就來詳細(xì)說一下
    2023-03-03
  • spring boot發(fā)簡單文本郵件案例

    spring boot發(fā)簡單文本郵件案例

    這篇文章主要介紹了spring boot發(fā)簡單文本郵件案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • IDEA 非常重要的一些設(shè)置項(xiàng)(一連串的問題差點(diǎn)讓我重新用回 Eclipse)

    IDEA 非常重要的一些設(shè)置項(xiàng)(一連串的問題差點(diǎn)讓我重新用回 Eclipse)

    這篇文章主要介紹了IDEA 非常重要的一些設(shè)置項(xiàng)(一連串的問題差點(diǎn)讓我重新用回 Eclipse),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • java數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)之漢諾塔示例

    java數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)之漢諾塔示例

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)和算法中的漢諾塔示例,需要的朋友可以參考下
    2014-02-02
  • Spring框架依賴注入方法示例

    Spring框架依賴注入方法示例

    這篇文章主要介紹了Spring框架依賴注入方法示例,分享了三種方法示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java實(shí)現(xiàn)簡單的分頁功能

    Java實(shí)現(xiàn)簡單的分頁功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單的分頁功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java堆排序原理與實(shí)現(xiàn)方法分析

    java堆排序原理與實(shí)現(xiàn)方法分析

    這篇文章主要介紹了java堆排序原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java堆排序的相關(guān)原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • 四個Java必須知道的負(fù)載均衡算法分享

    四個Java必須知道的負(fù)載均衡算法分享

    我們在設(shè)計(jì)系統(tǒng)的時候,為了系統(tǒng)的高擴(kuò)展性,會創(chuàng)建無狀態(tài)的系統(tǒng)。但是,要使系統(tǒng)具有更好的可擴(kuò)展性,除了無狀態(tài)設(shè)計(jì)之外,還要考慮采用什么負(fù)載均衡算法,本文就帶領(lǐng)大家認(rèn)識以下常見的4種負(fù)載均衡算法
    2023-01-01
  • SpringBoot JVM參數(shù)調(diào)優(yōu)方式

    SpringBoot JVM參數(shù)調(diào)優(yōu)方式

    這篇文章主要介紹了SpringBoot JVM參數(shù)調(diào)優(yōu)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

镇赉县| 四平市| 桃源县| 宜都市| 青州市| 陈巴尔虎旗| 安丘市| 南木林县| 西乌| 新兴县| 宁夏| 望谟县| 乾安县| 宜丰县| 盐池县| 抚松县| 广丰县| 南郑县| 都匀市| 绥中县| 新河县| 上蔡县| 新余市| 南投县| 石城县| 和顺县| 资中县| 岚皋县| 蓬溪县| 南投市| 兰溪市| 潍坊市| 民勤县| 齐齐哈尔市| 全椒县| 嘉黎县| 厦门市| 扎囊县| 措勤县| 成安县| 淄博市|