消息適配器應(yīng)用實操
1. 前言
Hello,大家好。本小節(jié)會繼續(xù)為同學(xué)們介紹 MessageListenerAdapter 消息適配器的相關(guān)使用。
在上一節(jié)中,我們介紹了 MessageListenerAdapter 消息適配器的基礎(chǔ)概念和基礎(chǔ)使用方法,這些是了解 MessageListenerAdapter 的前提,我們只有對這些基礎(chǔ)知識了解之后,我們才能掌握 MessageListenerAdapter 消息適配器的基本使用。
話不多說,讓我們直入正題吧。
本節(jié)主要內(nèi)容:
-
MessageListenerAdapter 常用方法概述;
-
MessageListenerAdapter 基本使用流程。
2. MessageListenerAdapter 常用方法概述
我們在上一節(jié)中,對 MessageListenerAdapter 消息適配器的方法有了簡單的了解,下面我來就看一下在 MessageListenerAdapter 中,都有哪些常用的方法吧。
方法名稱:
setDefaultListenerMethod()
方法作用:
指定 MessageListenerAdapter 消息適配器中的默認的監(jiān)聽消息的方法的名稱。
方法名稱:
setMessageConverter()
方法作用:
指定 MessageListenerAdapter 消息適配器中對應(yīng)消息監(jiān)聽方法的 Converter 方法參數(shù)轉(zhuǎn)換器。
setDefaultListenerMethod 方法和 setMessageConverter 方法是 MessageListenerAdapter 消息適配器中常用的兩個方法,也是使用頻率比較高的兩個方法,基本上只要使用 MessageListenerAdapter 消息適配器,就需要使用上述這兩個方法。
在介紹完常用的兩個方法之后,我們重點來看一下 MessageListenerAdapter 消息適配器的基本使用流程。
3. MessageListenerAdapter 基本使用流程
我們知道,在 RabbitMQ 中是存在生產(chǎn)者和消費者的,即生產(chǎn)者生產(chǎn)出來一條消息投放到 RabbitMQ 中,并最終被消費者所消費,在這一過程中,在生產(chǎn)者將消息投放到 RabbitMQ 中時,以及在消費者消費消息時,都可能要對消息進行監(jiān)聽處理。
而我們的 MessageListenerAdapter 則是在生產(chǎn)者將消息投放到 RabbitMQ 中時進行監(jiān)聽, 而這個監(jiān)聽過程是有一定的監(jiān)聽步驟的,下面就讓我們來看一下 MessageListenerAdapter 是如何監(jiān)聽消息被投放到 RabbitMQ 中的。
3.1 配置消息適配器基本骨架
在上節(jié)中,我們已經(jīng)將使用 MessageListenerAdapter 消息適配器所需的依賴引入了進來,所以這里不再贅述,我們直接來看如何配置 MessageListenerAdapter 基本骨架。
配置 MessageListenerAdapter 基本骨架的代碼如下所示:
MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());
container.setMessageListener(adapter);
return container;
代碼解釋:
第 1-2 行,是對 MessageListenerAdapter 進行初始化,上節(jié)已經(jīng)介紹過,這里不再贅述。
第 4 行,我們將初始化好的 adapter 通過 container 的 setMessageListener 方法,設(shè)置到我們的 container 容器中,至于這里的 container 指的是什么,同學(xué)們可以回顧之前小節(jié)的內(nèi)容,這里也不再介紹了。
第 5 行,我們將設(shè)置好的 container 容器進行返回。
通過上述代碼段,我們就已經(jīng)搭建好了使用 MessageListenerAdapter 消息適配器的基本骨架,剩下的就是在骨架中填充內(nèi)容了。
3.2 填充消息適配器
在上述內(nèi)容中,我們已經(jīng)對常用的兩個方法所有了解了,但是只是了解到這種程度是不夠的,下面將會詳細介紹這兩個常用的方法,即我們會通過這兩個常用的方法來填充 MessageListenerAdapter 消息適配器的骨架,使之具備處理相應(yīng)業(yè)務(wù)邏輯的能力。
3.2.1 設(shè)置 MessageListenerAdapter 默認監(jiān)聽方法
無論我們使用哪種消息監(jiān)聽方式,都需要配置一個或多個對應(yīng)的消息監(jiān)聽處理方法,使用 MessageListenerAdapter 消息適配器也是如此,只不過配置方法有些差別。
我們在配置消息監(jiān)聽處理方法時,MessageListenerAdapter 會要求我們自定義一個適配器的實現(xiàn), 也就是上述代碼段中的 new MessageAdapter() 中的 MessageAdapter 類,這個類就是我們自定義的適配器的實現(xiàn),在該類中,我們可以聲明我們的消息監(jiān)聽處理方法,而這個方法根據(jù) MessageListenerAdapter 消息適配器,是需要我們設(shè)置默認方法名稱的。
這個默認的方法名稱就是 handleMessage , 這個在 RabbitMQ 官方文檔,或者 MessageListenerAdapter 源碼實現(xiàn)中都有提到,感興趣的同學(xué)可以自行查閱。
handleMessage 這個名稱是默認的消息監(jiān)聽處理方法的名稱,但是在實際的工作中,我們更多的是需要自定義屬于某一業(yè)務(wù)的具體的消息監(jiān)聽處理方法,例如 registerHandleMessage 等等,那這種情況我們又該如何設(shè)置呢?
這就需要用到我們的 setDefaultListenerMethod 方法了,如下代碼所示:
代碼實現(xiàn):
MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());
adapter.setDefaultListenerMethod("registerHandleMessage");
container.setMessageListener(adapter);
return container;
代碼解釋:
配置 MessageListenerAdapter 骨架的代碼就不介紹了,我們直接來看第 4 行代碼。
第 4 行,我們使用 adapter 的 setDefaultListenerMethod 方法來將我們自定義的 registerHandleMessage 消息監(jiān)聽處理方法的方法名稱進行設(shè)置,從而允許我們的 MessageListenerAdapter 消息適配器可以使用自定義的消息監(jiān)聽處理方法的方法名稱。
3.2.2 設(shè)置 MessageListenerAdapter 自定義消息接收參數(shù)類型
我們都知道,RabbitMQ 中的消息是由消息參數(shù)和消息體所組成的,且消息的返回格式是 byte 類型的數(shù)組, 這就要求我們,如果想接收這一消息,所接收消息的方法中的參數(shù)類型一定要聲明為 byte 數(shù)組類型才可以,但是在有些業(yè)務(wù)場景中,則是需要用字符串的方式去接收,這又該如何實現(xiàn)呢?
要實現(xiàn)這一需求,我們就需要使用 setMessageConverter 方法,來將 byte 數(shù)組類型的參數(shù)轉(zhuǎn)換為我們所需要的消息參數(shù)類型,如下代碼所示:
MessageListenerAdapter adapter = new MessageListenerAdapter(new MessageAdapter());
adapter.setMessageConverter(new StringMessageConverter());
container.setMessageListener(adapter);
return container;
代碼解釋:
配置 MessageListenerAdapter 骨架的代碼不再贅述,我們直接來看第 4 行代碼。
第 4 行,我們使用 adapter 的 setMessageListener 方法來將我們自定義的 StringMessageConverter 轉(zhuǎn)換器傳入到 MessageListenerAdapter 消息適配器中,來讓 MessageListenerAdapter 消息適配器具備以字符串的方式來接收 RabbitMQ 中消息的能力。
對應(yīng)的 StringMessageConverter 中的核心代碼如下所示:
public class StringMessageConverter implements MessageConverter {
@Override
public Message toMessage(Object object, MessageProperties messageProperties) throws MessageConversionException {
return new Message(object.toString().getBytes(), messageProperties);
}
@Override
public Message fromMessage(Message message) throws MessageConversionException {
// 一些邏輯處理
}
}
代碼解釋:
第 1-2 行,我們聲明了一個名為 StringMessageConverter 的類,并且實現(xiàn)了 MessageConverter 接口,重寫了接口中對應(yīng)的兩個方法。
第 7 行,在 toMessage 方法中,我們對方法的返回值進行了處理,即該方法返回了一個 Message 實例,在這個 Message 實例的構(gòu)造方法中,我們對接收消息的 object 參數(shù)進行了轉(zhuǎn)換為字符串形式的處理,這樣就使得MessageListenerAdapter 消息適配器具備了以字符串的方式來接收 RabbitMQ 中消息的能力。
至于其他的代碼,不是我們本節(jié)所要考慮的內(nèi)容,所以這里就不再介紹了,感興趣的同學(xué)可以自行了解。
Tips: 1. MessageListenerAdapter 消息適配器的基本使用流程,就是配置出 MessageListenerAdapter 的基本骨架,然后根據(jù)實際的業(yè)務(wù)需求,來填充這個骨架的內(nèi)容;
2. 我們只是介紹了兩個常用的方法,在 MessageListenerAdapter 中還存在其他的方法,只不過使用的頻率不是很高,如有需要同學(xué)們可自行了解。
4. 小結(jié)

本小節(jié)為同學(xué)們詳細介紹了 MessageListenerAdapter 消息適配器的基本使用流程,包括如何配置 MessageListenerAdapter 消息適配器的基本骨架,如何填充 MessageListenerAdapter 消息適配器的骨架內(nèi)容,從而滿足實際的業(yè)務(wù)需要。旨在幫助各位同學(xué)可以對 MessageListenerAdapter 消息適配器的基本使用流程有一個簡單的了解和思路,這樣在實際的項目開發(fā)中才能用好 MessageListenerAdapter 消息適配器。