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

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