溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用

發(fā)布時(shí)間:2023-05-09 16:57:19 來(lái)源:億速云 閱讀:101 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

在SpringAMQP的發(fā)送方法中,接收消息的類(lèi)型是Object,也就是說(shuō)我們可以發(fā)送任意對(duì)象類(lèi)型的消息,SpringAMQP會(huì)幫我們序列化為字節(jié)后發(fā)送。

我們以實(shí)際例子來(lái)做一個(gè)演示,首先在項(xiàng)目中的FanoutConfig配置類(lèi)聲明一個(gè)新的隊(duì)列:

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");
    }
}

接著我們?cè)谏a(chǎn)者模塊中編寫(xiě)發(fā)送消息的測(cè)試代碼:

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)建一個(gè)map集合
        msg.put("name","小威");
        msg.put("age",21);
        rabbitTemplate.convertAndSend("object.queue",msg);//發(fā)送消息
    }
}

消息發(fā)送代碼編寫(xiě)完成后,重啟項(xiàng)目,打開(kāi)RabbitMQ的虛擬機(jī)對(duì)應(yīng)地址可以看到我們編寫(xiě)的name和age出現(xiàn)了特殊的情況:

RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用

這是因?yàn)镽abbitMQ只支持字節(jié)的序列化方式,spring支持發(fā)送object對(duì)象消息,由上圖可以看到content_type的轉(zhuǎn)化方式,spring將封裝的map對(duì)象序列化了一長(zhǎng)串字符串。

那么我們?cè)撊绾谓鉀Q這個(gè)問(wèn)題呢?

首先,Spring的消息對(duì)象的處理是由org.springframework.amqp.support.converter.MessageConverter來(lái)處理的。默認(rèn)實(shí)現(xiàn)是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。

因此,我們需要定義一個(gè)MessageConverter 類(lèi)型的Bean,可以使用json的方式序列化,在父工程中引入json的依賴:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

然后在生產(chǎn)者模塊的啟動(dòng)類(lèi)中聲明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)者模塊可以看到我們想要的消息對(duì)象結(jié)果了:

RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用

對(duì)于消費(fèi)者也同理,首選引入依賴,接著在啟動(dòng)類(lèi)中編寫(xiě)和生產(chǎn)者一樣的代碼,最后定義一個(gè)消費(fèi)者監(jiān)聽(tīng)該隊(duì)列:

    @RabbitListener(queues = "object.queue")
    public void listenObjectQueue(Map<String,Object> msg){
        System.out.println("接受到object.queue的消息:"+msg);
    }

啟動(dòng)消費(fèi)者模塊可以看到控制臺(tái)輸出的結(jié)果:

RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用

讀到這里,這篇“RabbitMQ消息轉(zhuǎn)換器怎么應(yīng)用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI