欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中@RabbitHandler和@RabbitListener的區(qū)別詳析

 更新時間:2024年02月20日 10:03:01   作者:來自宇宙的曹先生  
@RabbitHandler是用于處理消息的方法注解,它與@RabbitListener注解一起使用,這篇文章主要給大家介紹了關(guān)于Spring中@RabbitHandler和@RabbitListener區(qū)別的相關(guān)資料,需要的朋友可以參考下

@RabbitHandler 和 @RabbitListener 是Spring AMQP(特別是針對RabbitMQ)中常用的兩個注解,它們在消息處理中扮演著不同的角色。

@RabbitListener

  • 定義@RabbitListener 注解用于標(biāo)記一個方法,使其成為消息隊(duì)列的監(jiān)聽器,即這個方法負(fù)責(zé)接收來自RabbitMQ的消息。

  • 使用場景:當(dāng)你想讓某個服務(wù)類中的方法直接監(jiān)聽某個RabbitMQ隊(duì)列時,你會在該方法上使用 @RabbitListener。

  • 功能

    • 它可以指定監(jiān)聽的隊(duì)列、交換機(jī)和路由鍵。
    • 支持異步處理,可以處理發(fā)送到指定隊(duì)列的消息。
    • 可以與Spring的 @Transactional 注解結(jié)合使用,以確保消息處理的事務(wù)性。

@RabbitHandler

  • 定義@RabbitHandler 注解用于標(biāo)記一個方法,作為特定類型的消息的處理器。

  • 使用場景:在一個類中可能有多個不同的方法處理不同類型的消息。這時,你可以在這個類上使用 @RabbitListener,然后在每個處理方法上使用 @RabbitHandler,以便根據(jù)消息類型調(diào)用適當(dāng)?shù)姆椒ā?/p>

  • 功能

    • 主要用于方法級別的多態(tài),即在同一個類中根據(jù)消息的不同類型來調(diào)用不同的處理方法。
    • 允許你在同一個監(jiān)聽器類中定義多個處理不同類型消息的方法。

結(jié)合使用

  • 通常,@RabbitListener 用于類級別或方法級別,定義消息的入口點(diǎn),即指定哪個隊(duì)列的消息會被監(jiān)聽。
  • @RabbitHandler 則用于在同一類中的不同方法上,根據(jù)接收到的消息類型調(diào)用相應(yīng)的方法。

示例

@Component
public class MyMessageListener {

    @RabbitListener(queues = "myQueue")
    public void process(String data) {
        // 處理字符串類型的消息
    }

    @RabbitListener(queues = "myQueue")
    @RabbitHandler
    public void process(MyCustomObject object) {
        // 處理 MyCustomObject 類型的消息
    }
}

在這個示例中,@RabbitListener 用于指定監(jiān)聽的隊(duì)列,而 @RabbitHandler 用于區(qū)分不同類型的消息應(yīng)由哪個方法處理。這種結(jié)構(gòu)使得在同一個監(jiān)聽器類中可以方便地處理多種類型的消息。

更詳細(xì)的例子來闡明 @RabbitListener 和 @RabbitHandler 在實(shí)際使用中的差異和結(jié)合方式。

示例 1:基本的 @RabbitListener 使用

假設(shè)有一個場景,你需要監(jiān)聽一個名為 ordersQueue 的RabbitMQ隊(duì)列,并對收到的訂單消息進(jìn)行處理。

@Component
public class OrderService {

    @RabbitListener(queues = "ordersQueue")
    public void receiveOrder(String orderJson) {
        // 解析訂單JSON數(shù)據(jù)
        Order order = parseOrder(orderJson);
        // 處理訂單
        processOrder(order);
    }

    // ...其他方法,如parseOrder和processOrder
}

在這個例子中,@RabbitListener 直接應(yīng)用于方法 receiveOrder,這意味著這個方法將監(jiān)聽 ordersQueue 隊(duì)列,并處理所有接收到的消息。

示例 2:結(jié)合使用 @RabbitListener 和 @RabbitHandler

考慮一個稍微復(fù)雜的場景,其中一個服務(wù)需要處理兩種類型的消息:文本消息和JSON格式的訂單消息。

@Component
@RabbitListener(queues = "mixedMessagesQueue")
public class MixedMessageService {

    @RabbitHandler
    public void processTextMessage(String text) {
        // 處理文本消息
        System.out.println("Received text message: " + text);
    }

    @RabbitHandler
    public void processOrderMessage(Order order) {
        // 處理訂單對象
        System.out.println("Received order: " + order);
    }

    // ...其他可能的方法
}

在這個例子中,@RabbitListener 注解應(yīng)用于類級別,意味著這個類中的所有方法都會監(jiān)聽 mixedMessagesQueue 隊(duì)列。@RabbitHandler 則用于區(qū)分不同的處理方法:processTextMessage 用于處理文本消息,而 processOrderMessage 用于處理訂單對象。Spring會根據(jù)消息的類型自動選擇合適的方法。

示例 3:使用 @RabbitListener 的多方法監(jiān)聽

在某些情況下,你可能希望在同一個類中,不同的方法監(jiān)聽不同的隊(duì)列。

@Component
public class MultiQueueListener {

    @RabbitListener(queues = "textQueue")
    public void processTextMessage(String text) {
        // 處理來自textQueue的文本消息
    }

    @RabbitListener(queues = "ordersQueue")
    public void processOrder(Order order) {
        // 處理來自ordersQueue的訂單消息
    }
}

這個例子展示了在同一個類中,不同的方法可以監(jiān)聽不同的隊(duì)列。processTextMessage 監(jiān)聽 textQueue 隊(duì)列,而 processOrder 監(jiān)聽 ordersQueue 隊(duì)列。

這些例子展示了 @RabbitListener 和 @RabbitHandler 在不同場景下的應(yīng)用方式,包括單獨(dú)使用 @RabbitListener、將 @RabbitListener 與 @RabbitHandler 結(jié)合使用以及在同一個類中使用多個 @RabbitListener 注解來監(jiān)聽不同的隊(duì)列。

附:@RabbitListener或@RabbitHandler使用出現(xiàn)死循環(huán)

異常1問題:為什么會找不到消費(fèi)實(shí)現(xiàn)?

@RabbitListener 或 @RabbitHandler 配置出錯

很大原因是取決于content_type 的配置和 方法的形參。

如果通過客戶端放入隊(duì)列中有個content_type為空的的消息,@RabbitListener只有形參為String 的Handler,是無法對應(yīng)上消費(fèi)實(shí)現(xiàn)的。
@RabbitHandler 沒有使用可選參數(shù)isDefault

消費(fèi)者找不到任何一個消費(fèi)實(shí)現(xiàn),就回去找isDefault = true 的 handler,類似一個兜底策略。

異常1問題:處理思路

使用Message 作為方法形參

盡量將@RabbitListener 放在類上, 使用@RabbitHandler(isDefault = true) 做兜底策略

異常1分析 :死循環(huán)分析

這是一種應(yīng)用級別的死循環(huán),消息找不到消費(fèi)實(shí)現(xiàn),一直重試直到找到消費(fèi)實(shí)現(xiàn)。這種死循環(huán)原因是配置失誤,要在源頭避免,測試階段就要消滅?!菊业较@種死循環(huán)的方法再來填坑】。另外一種必須處理的死循環(huán)是已經(jīng)找到消費(fèi)實(shí)現(xiàn),但是在消費(fèi)的過程中造成死循環(huán),見異常2:

【異常2】:消費(fèi)過程中拋出未捕獲Exception

通常是業(yè)務(wù)邏輯導(dǎo)致的異常如NullPointerException,無腦的做法是try-catch,處理不當(dāng)依舊會造成死循環(huán)。

異常2問題:try-catch后仍然會死循環(huán)

總結(jié)

到此這篇關(guān)于Spring中@RabbitHandler和@RabbitListener區(qū)別的文章就介紹到這了,更多相關(guān)@RabbitHandler和@RabbitListener區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Java泛型之上界下界通配符詳解

    Java泛型之上界下界通配符詳解

    這篇文章主要介紹了Java泛型之上界下界通配符詳解,學(xué)習(xí)使用泛型編程時,更令人困惑的一個方面是確定何時使用上限有界通配符以及何時使用下限有界通配符。本文提供一些設(shè)計代碼時要遵循的一些準(zhǔn)則。,需要的朋友可以參考下
    2019-06-06
  • Eclipse新建web項(xiàng)目流程圖解

    Eclipse新建web項(xiàng)目流程圖解

    這篇文章主要介紹了Eclipse新建web項(xiàng)目流程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Spring實(shí)現(xiàn)HikariCP連接池的示例代碼

    Spring實(shí)現(xiàn)HikariCP連接池的示例代碼

    在SpringBoot 2.0中,我們使用默認(rèn)連接池是HikariCP,本文講一下HikariCP的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • JSONObject按put順序排放與輸出方式

    JSONObject按put順序排放與輸出方式

    這篇文章主要介紹了JSONObject按put順序排放與輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java處理InterruptedException異常的理論與實(shí)踐

    Java處理InterruptedException異常的理論與實(shí)踐

    在使用Java的過程中,有個情景或許很多人見過,您在編寫一個測試程序,程序需要暫停一段時間,于是調(diào)用 Thread.sleep()。但是編譯器或 IDE 報錯說沒有處理檢查到的 InterruptedException。InterruptedException 是什么呢,為什么必須處理它?下面跟著小編一起來看看。
    2016-08-08
  • SpringBoot整合WebSocket實(shí)現(xiàn)聊天室流程全解

    SpringBoot整合WebSocket實(shí)現(xiàn)聊天室流程全解

    WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。本文將通過SpringBoot集成WebSocket實(shí)現(xiàn)簡易聊天室,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,感興趣的可以了解一下
    2023-01-01
  • Java打印數(shù)組的三種方法整理

    Java打印數(shù)組的三種方法整理

    許多學(xué)編程專業(yè)的同學(xué)面試的時候,考官都會問到Java如何打印數(shù)組這樣的問題,下面這篇文章主要給大家介紹了關(guān)于Java打印數(shù)組的三種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • java 開發(fā)使用字符串和數(shù)字的性能分析

    java 開發(fā)使用字符串和數(shù)字的性能分析

    這篇文章主要介紹了java 開發(fā)使用字符串和數(shù)字的性能分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解

    SpringCloud Feign遠(yuǎn)程調(diào)用與自定義配置詳解

    Feign是Netflix公司開發(fā)的一個聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時出現(xiàn)的,而且配置也都非常相似
    2022-11-11
  • 關(guān)于Maven如何構(gòu)建生命周期

    關(guān)于Maven如何構(gòu)建生命周期

    這篇文章主要介紹了關(guān)于Maven如何構(gòu)建生命周期,Maven構(gòu)建生命周期描述的是一次構(gòu)建過程經(jīng)歷經(jīng)歷了多少個事件,需要的朋友可以參考下
    2023-04-04

最新評論