一文帶你了解RabbitMQ消息轉(zhuǎn)換器
在SpringAMQP的發(fā)送方法中,接收消息的類型是Object,也就是說(shuō)我們可以發(fā)送任意對(duì)象類型的消息,SpringAMQP會(huì)幫我們序列化為字節(jié)后發(fā)送。
我們以實(shí)際例子來(lái)做一個(gè)演示,首先在項(xiàng)目中的FanoutConfig配置類聲明一個(gè)新的隊(duì)列:
package cn.itcast.mq.config; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FanoutConfig { @Bean public Queue objectQueue(){ return new Queue("object.queue"); } }
接著我們?cè)谏a(chǎn)者模塊中編寫發(fā)送消息的測(cè)試代碼:
package cn.itcast.mq.spring; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.HashMap; import java.util.Map; @SpringBootTest @RunWith(SpringRunner.class) public class SpringAmqpTest { @Autowired private RabbitTemplate rabbitTemplate; @Test public void testSendObjectQueue(){ Map<String,Object> msg =new HashMap<>();//創(chuàng)建一個(gè)map集合 msg.put("name","小威"); msg.put("age",21); rabbitTemplate.convertAndSend("object.queue",msg);//發(fā)送消息 } }
消息發(fā)送代碼編寫完成后,重啟項(xiàng)目,打開RabbitMQ的虛擬機(jī)對(duì)應(yīng)地址可以看到我們編寫的name和age出現(xiàn)了特殊的情況:
這是因?yàn)镽abbitMQ只支持字節(jié)的序列化方式,spring支持發(fā)送object對(duì)象消息,由上圖可以看到content_type的轉(zhuǎn)化方式,spring將封裝的map對(duì)象序列化了一長(zhǎng)串字符串。
那么我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢?
首先,Spring的消息對(duì)象的處理是由org.springframework.amqp.support.converter.MessageConverter來(lái)處理的。默認(rèn)實(shí)現(xiàn)是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。
因此,我們需要定義一個(gè)MessageConverter 類型的Bean,可以使用json的方式序列化,在父工程中引入json的依賴:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
然后在生產(chǎn)者模塊的啟動(dòng)類中聲明bean:
package cn.itcast.mq; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.Jackson2XmlMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication public class PublisherApplication { public static void main(String[] args) { SpringApplication.run(PublisherApplication.class); } @Bean public MessageConverter jsonMessageConverter(){ return new Jackson2JsonMessageConverter(); } }
再次重啟生產(chǎn)者模塊可以看到我們想要的消息對(duì)象結(jié)果了:
對(duì)于消費(fèi)者也同理,首選引入依賴,接著在啟動(dòng)類中編寫和生產(chǎn)者一樣的代碼,最后定義一個(gè)消費(fèi)者監(jiān)聽該隊(duì)列:
@RabbitListener(queues = "object.queue") public void listenObjectQueue(Map<String,Object> msg){ System.out.println("接受到object.queue的消息:"+msg); }
啟動(dòng)消費(fèi)者模塊可以看到控制臺(tái)輸出的結(jié)果:
到此這篇關(guān)于一文帶你了解RabbitMQ消息轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)RabbitMQ消息轉(zhuǎn)換器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成mybatis連接oracle的圖文教程
這篇文章主要介紹了Spring Boot集成mybatis連接oracle的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02mybatis的動(dòng)態(tài)SQL和模糊查詢實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于mybatis的動(dòng)態(tài)SQL和模糊查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Spring?Boot整合持久層之JPA多數(shù)據(jù)源
JPA(Java Persistence API)Java 持久化 API,是 Java 持久化的標(biāo)準(zhǔn)規(guī)范,Hibernate 是持久化規(guī)范的技術(shù)實(shí)現(xiàn),而 Spring Data JPA 是在 Hibernate 基礎(chǔ)上封裝的一款框架2022-08-08Java實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08ssm框架controller層返回json格式數(shù)據(jù)到頁(yè)面的實(shí)現(xiàn)
這篇文章主要介紹了ssm框架controller層返回json格式數(shù)據(jù)到頁(yè)面的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringBoot的@RestControllerAdvice作用詳解
這篇文章主要介紹了SpringBoot的@RestControllerAdvice作用詳解,@RestContrllerAdvice是一種組合注解,由@ControllerAdvice,@ResponseBody組成,本質(zhì)上就是@Component,需要的朋友可以參考下2024-01-01Java 梳理總結(jié)關(guān)于static關(guān)鍵字常見問(wèn)題
static關(guān)鍵字基本概念我們可以一句話來(lái)概括:方便在沒有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用。也就是說(shuō):被static關(guān)鍵字修飾的不需要?jiǎng)?chuàng)建對(duì)象去調(diào)用,直接根據(jù)類名就可以去訪問(wèn),讓我們來(lái)了解一下你可能還不知道情況2022-04-04Java微信公眾平臺(tái)開發(fā)(8) 多媒體消息回復(fù)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第八步,微信多媒體消息回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04