一文帶你了解RabbitMQ消息轉(zhuǎn)換器
在SpringAMQP的發(fā)送方法中,接收消息的類型是Object,也就是說我們可以發(fā)送任意對象類型的消息,SpringAMQP會幫我們序列化為字節(jié)后發(fā)送。
我們以實際例子來做一個演示,首先在項目中的FanoutConfig配置類聲明一個新的隊列:
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");
}
}
接著我們在生產(chǎn)者模塊中編寫發(fā)送消息的測試代碼:
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)建一個map集合
msg.put("name","小威");
msg.put("age",21);
rabbitTemplate.convertAndSend("object.queue",msg);//發(fā)送消息
}
}消息發(fā)送代碼編寫完成后,重啟項目,打開RabbitMQ的虛擬機對應(yīng)地址可以看到我們編寫的name和age出現(xiàn)了特殊的情況:

這是因為RabbitMQ只支持字節(jié)的序列化方式,spring支持發(fā)送object對象消息,由上圖可以看到content_type的轉(zhuǎn)化方式,spring將封裝的map對象序列化了一長串字符串。
那么我們該如何解決這個問題呢?
首先,Spring的消息對象的處理是由org.springframework.amqp.support.converter.MessageConverter來處理的。默認實現(xiàn)是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。
因此,我們需要定義一個MessageConverter 類型的Bean,可以使用json的方式序列化,在父工程中引入json的依賴:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>然后在生產(chǎn)者模塊的啟動類中聲明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)者模塊可以看到我們想要的消息對象結(jié)果了:

對于消費者也同理,首選引入依賴,接著在啟動類中編寫和生產(chǎn)者一樣的代碼,最后定義一個消費者監(jiān)聽該隊列:
@RabbitListener(queues = "object.queue")
public void listenObjectQueue(Map<String,Object> msg){
System.out.println("接受到object.queue的消息:"+msg);
}啟動消費者模塊可以看到控制臺輸出的結(jié)果:

到此這篇關(guān)于一文帶你了解RabbitMQ消息轉(zhuǎn)換器的文章就介紹到這了,更多相關(guān)RabbitMQ消息轉(zhuǎn)換器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將InputStream轉(zhuǎn)化為base64的實例
這篇文章主要介紹了將InputStream轉(zhuǎn)化為base64的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java+Selenium實現(xiàn)文件上傳下載功能詳解
這篇文章主要介紹了java代碼如何利用selenium操作瀏覽器上傳和下載文件功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下2023-01-01
SpringMVC項目訪問controller時候報404的解決
這篇文章主要介紹了SpringMVC項目訪問controller時候報404的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringBoot異步使用@Async的原理以及線程池配置詳解
在項目中當(dāng)訪問其他人的接口較慢時,不想程序一直卡在耗時任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線程來并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async,這篇文章主要給大家介紹了關(guān)于SpringBoot異步使用@Async的原理以及線程池配置的相關(guān)資料2021-09-09
Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?
今天小編就為大家分享一篇關(guān)于Java如何將處理完異常之后的程序能夠從拋出異常的地點向下執(zhí)行?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
SpringBoot Security整合JWT授權(quán)RestAPI的實現(xiàn)
這篇文章主要介紹了SpringBoot Security整合JWT授權(quán)RestAPI的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

