RabbitMQ消息轉(zhuǎn)換器
在SpringAMQP的發(fā)送方法中,發(fā)送消息和接受消息的類型都是Object,也就是說(shuō),我們可以發(fā)送任意對(duì)象類型的消息,SpringAMQP都會(huì)幫我們把發(fā)送的消息序列化為字節(jié)后再進(jìn)行發(fā)送。下面,我們可以演示一下:
假設(shè)我們現(xiàn)在有個(gè)User類,如下(切記一定要實(shí)現(xiàn)Serializable接口,才能被jdk序列化和反序列化):
@Data
public class User implements Serializable {
private String name;
private Integer age;
private Date birthday;
}
然后我們?cè)?strong>監(jiān)聽(tīng)服務(wù)中注冊(cè)一個(gè)名為 “object.queue” 的隊(duì)列。
@Configuration
public class FanoutConfig {
@Bean
public Queue objectQueue(){
return new Queue("object.queue");
}
}
然后啟動(dòng)我們的監(jiān)聽(tīng)服務(wù),可以看到,在RabbitMq上已經(jīng)可以看到我們剛才新建的隊(duì)列了:
為了觀察我們發(fā)送到RabbitMQ的對(duì)象,我們這里先把監(jiān)聽(tīng)服務(wù)關(guān)掉。
然后我們編寫一個(gè)發(fā)送消息的測(cè)試方法如下:
@Test
public void testObject(){
//接受的隊(duì)列名稱
String queueName = "object.queue";
//新建對(duì)象
User user = new User();
user.setName("張三");
user.setAge(1);
user.setBirthday(new Date());
rabbitTemplate.convertAndSend(queueName, user);
}
編寫完成后,我們運(yùn)行該方法。然后,我們到rabbitMq上面看一下接收到的消息:
這里,我們可以看到,我們的content_type的值是 application/x-java-serialized-object (Java序列化對(duì)象)。
此時(shí),我們啟動(dòng)我們的監(jiān)聽(tīng)服務(wù),可以接收到消息如下:
上面我們雖然也可以成功發(fā)送和接收對(duì)線,但是默認(rèn)的基于JDK做的序列化存在下列問(wèn)題:
- 數(shù)據(jù)體積過(guò)大
- 有安全漏洞
- 可讀性差
因此,我們正常使用的情況下,我們不會(huì)使用默認(rèn)的JDK的序列化,而是會(huì)用我們的JSON轉(zhuǎn)換器。
這里說(shuō)明一下:Spring的隊(duì)列消息對(duì)象的處理是由 MessageConverter 來(lái)處理的,而默認(rèn)實(shí)現(xiàn)是 SimpleMessageConverter,該類基于 JDK 的 ObjectOutputStream 完成序列化。
如果我們?cè)谖覀兊?strong>配置類中,注冊(cè)一個(gè) MessageConverter 類型的 Bean 即可。推薦使用 JSON 方式序列化,步驟如下:
在 發(fā)送服務(wù) 和 接收服務(wù) 中都引入我們的依賴:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.10</version>
</dependency>
然后,我們?cè)?發(fā)送服務(wù) 和 接收服務(wù) 的啟動(dòng)類中添加我們的Bean如下:
這里返回的 MessageConverter 必須是amqp包下的 MessageConverter。(import org.springframework.amqp.support.converter.MessageConverter)
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
為了看我們發(fā)送到rabbitMq的消息的形式,這里,我們還是把消費(fèi)者服務(wù)先停掉,然后重新運(yùn)行我們剛才發(fā)送User對(duì)象的測(cè)試方法。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-454013.html
發(fā)送成功后,我們獲取我們的Message可以看到,此時(shí)的content_type是 application/json,而消息的可讀性也變高了,細(xì)心的小伙伴應(yīng)該也可以看到,這里需要的字節(jié)數(shù)也變少了。
然后我們重新啟動(dòng)我們的消費(fèi)者服務(wù),再次觀察結(jié)果如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-454013.html
到了這里,關(guān)于RabbitMQ消息轉(zhuǎn)換器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!