当前位置: 首页 > article >正文

RabbitMQ配置消息转换器

如果不配置转换器,在RabbitMQ中获取的消息乱码...

配置

1.引入依赖

<!--        消息队列JSON转换器-->
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.9.10</version>
        </dependency>

2.创建转换的Bean(这里的Jackson2JsonMessageConverter类的包不要引错)

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class messageConverter {
    @Bean
    public MessageConverter messageConvertertest() {
        // 1.定义消息转换器
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        // 2.配置自动创建消息id,用于识别不同消息,也可以在业务中基于ID判断是否是重复消息
        jackson2JsonMessageConverter.setCreateMessageIds(true);
        return jackson2JsonMessageConverter;
    }
}

测试

写入生产者和消费者

生产者我是在测试中写入

    @Test
    public void testSendMapMessage()   {
        Map<String,Object> msg = new HashMap<>();
        msg.put("id", 1);
        msg.put("name", "柳岩");
        msg.put("age", 21);
        rabbitTemplate.convertAndSend("test.exchange", "test.key", msg);
    }

这里指定的交换机是test.exchange,绑定的routingkey是test.key,通过routingkey可以找到对应的消息队列

消费者

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "test.json.queue", durable = "true"),
            exchange = @Exchange(name = "test.exchange", type = ExchangeTypes.TOPIC),
            key = "test.key"
    ))
    public void ToExchangeToQueue3(Map<String, Object> message){
        System.out.println("消费者接收到test.json.queue消息:【" + message + "】");
    }

消费者的交换机名字需要与生产者交换机名字一致,key需与生产者的routingkey一致,交换机类型设置了topic类型,通过交换机名字和绑定的routingkey可以转发到队列test.json.queue,然后将消息输出

测试发送消息

另外可以再创建一个消费者,绑定test.json.queue队列

    @RabbitListener(queues = "test.json.queue")
    public void listenSimpleQueueMessage(Map<String, Object> msg) throws InterruptedException {
        System.out.println("消费者2:【" + msg + "】");
    }

然后模拟发送十条消息


    @Test
    public void testSendMap()   {
        Map<String,Object> msg = new HashMap<>();
        //模拟发送十条消息
        int count = 10;
        for (int i = 0; i < count; i++) {
            msg.put("id", i);
            msg.put("name", "柳岩");
            msg.put("age", 21);
            rabbitTemplate.convertAndSend("test.exchange", "test.key", msg);
        }
    }

输出结果

控制台和测试控制台一共输出十条数据,可以发现当多个消费者绑定同一个队列时,RabbitMQ采用轮询方式分配给不同的消费者


http://www.kler.cn/a/580120.html

相关文章:

  • 【Linux】初识线程
  • 面试:hive的优化, 4个by, 存储过程和自定义函数
  • 【Java学习】泛型
  • 谷歌AI最新发布的可微分逻辑元胞自动机(DiffLogic CA)
  • lnmp平台
  • React 学习全阶段总结
  • 基于Kubernetes部署MySQL主从集群
  • 笔记六:单链表链表介绍与模拟实现
  • Anaconda中虚拟环境安装g++和gcc相同版本
  • 在 Flask 项目中访问其他页面
  • BGP实验(一)IBGP全互联配置
  • 解决asp.net mvc发布到iis下安全问题
  • javascript-es6 (六)
  • C语言八股---预处理,编译,汇编与链接篇
  • 【CSS3】金丹篇
  • 短分享-Flink图构建
  • 个人记录的一个插件,Unity-RuntimeMonitor
  • HAL库常用函数
  • 基于Asp.net的高校迎新管理系统
  • Linux Bash 单命令行解释 | 文件操作 / 字符串操作 / 重定向