org.springframework.amqp.support.converter.MessageConverter
Message toMessage(Object object, MessageProperties messageProperties);
將java對象和屬性對象轉換成Message對象。
Object fromMessage(Message message) throws MessageConversionException;
將消息對象轉換成java對象。
定義Config類
MessageListenerAdapter中定義的消息轉換器,消費端接收的消息就從Message類型轉換成了String類型
消費者處理消息的Handler
啟動類
啟動應用類,發送消息到 zhihao.miao.order 隊列,控制臺打印:
從控制臺打印我們知道了在消費者處理消息之前會進行消息類型轉換,調用 TestMessageConverter 的 fromMessage 方法,然後執行消息處理器的 onMessage 方法,方法參數就是 String 類型。
自定義壹個MyBody類型,將消息從Message轉換成MyBody類型
然後修改 TestMessageConverter 的 fromMessage 方法,返回了 MyBody 類型,那麽消息處理器的消費方法也是MyBody參數的消費方法
此時的消息處理器,處理器中的方法的入參就是MyBody類型了,
此時控制臺打印:
我們還測試如下如果不使用自定義的 Converter ,那麽當消息的屬性中含有屬性content_type的值為text,那麽默認的轉換成的java類型就是String類型,如果不指定那麽默認的轉換類型就是byte[]
我們跟進去 MessageListenerAdapte r的 setMessageConverter 方法,
我們發現默認的 MessageConverter 是 SimpleMessageConverter ,我們進入 SimpleMessageConverter 類中看其默認的轉換邏輯
源碼分析總結:
1. MessageConverter 可以把 java 對象轉換成 Message 對象,也可以把 Message 對象轉換成 java 對象
2. MessageListenerAdapter 內部通過 MessageConverter 把 Message 轉換成java對象,然後找到相應的處理方法,參數為轉換成的java對象。
3. SimpleMessageConverter 處理邏輯:
如果 content_type 是以text開頭,則把消息轉換成 String 類型
如果 content_type的 值是 application/x-java-serialized-object 則把消息序列化為java對象,否則,把消息轉換成字節數組。