一、訊息轉換器
Spring會把你傳送的訊息序列化為位元組傳送給MQ,接收訊息的時候,還會把位元組反序列化為Java物件。
只不過,預設情況下Spring採用的序列化方式是JDK序列化。眾所周知,JDK序列化存在下列問題:
- 資料體積過大
- 有安全漏洞
- 可讀性差
JDK序列化方式並不合適。我們希望訊息體的體積更小、可讀性更高,因此可以使用JSON方式來做序列化和反序列化。
二、實現JSON訊息轉換器
spring 的對訊息物件的處理是由org.springframework.amqp.support.converter.MessageConverter來處理的.而預設實現是SimpleMeaasgeConverter,基於JDK的ObjectOutputStream完成序列化。
如果要修改只需要定義一個MessageConverter型別的Bean即可.推薦使用JSON方式序列化,步驟如下:
步驟一:
我們在publisher服務和consumer服務的父工程引入依賴:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
步驟二:
我們在publisher服務宣告MessageConverter:
@Bean public MessageConverter essageConverter(){ return new Jackson2JsonMessageConverter(); }
步驟三:
我們在consumer服務定義MessageConverter
@Bean public MessageConverter jsonMessageConverter(){ return new Jackson2JsonMessageConverter(); }
步驟四:
定義生產者,向object.queue佇列傳送訊息
@Test public void testSendObjectQueue() { Map<String, Object> map = new HashMap<>(); map.put("name","張三"); map.put("age",21); // 傳送訊息 rabbitTemplate.convertAndSend( "object.queue", map); }
步驟五:
然後定義一個消費者,監聽object.queue佇列並消費資訊:
@RabbitListener(queues = "object.queue") public void listenObjectQueue(Map<String,Object> msg){ System.out.println("接收到object.queue的訊息:" + msg); }
注意:傳送方與接收方必須使用相同的MessageConverter。
執行測試:
傳送訊息後檢視控制檯:
資料格式為:content_type:application/json