RabbitMQ 入門(三)SpringAMQP訊息轉換器

努力--坚持發表於2024-10-26

  一、訊息轉換器


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

相關文章