首页 > 其他分享 >Spring Boot 集成 RabbitMQ 自定义 MessageConverter

Spring Boot 集成 RabbitMQ 自定义 MessageConverter

时间:2024-10-12 16:49:32浏览次数:7  
标签:自定义 MessageConverter Spring public javaTimeModule spring new message class

1. Spring Boot 集成 RabbitMQ 自定义消息转换器

1.1. 版本说明

构件 版本
spring-boot 2.7.18
spring-boot-starter-amqp 2.7.18
spring-boot-starter-json 2.7.18
hutool-all 5.8.27

1.2. 概述

这里使用常见的 JSON 作为消息传输格式,自定义 Jackson2JsonMessageConverter 对消息进行转换

1.3. Spring 配置

spring:
  application:
    name: spring-rabbit-message-converter-demo
  rabbitmq:
    addresses: 127.0.0.1:5672
    username: admin
    password: admin
    virtual-host: /

1.4. 定义常量

public class SpringRabbitMessageConverterDemoConstants {
    public static final String QUEUE = "spring-rabbit-message-converter-demo-queue";
    public static final String EXCHANGE = "spring-rabbit-message-converter-demo-exchange";
}

1.5. 配置交换机和队列

@Bean
public Queue queue() {
    return QueueBuilder.durable(QUEUE).build();
}

@Bean
public FanoutExchange exchange() {
    return ExchangeBuilder.fanoutExchange(EXCHANGE).durable(true).build();
}

@Bean
public Binding binding() {
    return BindingBuilder.bind(queue()).to(exchange());
}

1.6. 配置 ObjectMapper

添加对 Java 8 时间类型 LocalDateTimeLocalDate 序列化和反序列化支持;添加长整形序列化字符串支持;

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
    return jacksonObjectMapperBuilder -> {
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(NORM_DATETIME_FORMATTER));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(NORM_DATE_FORMATTER));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(NORM_TIME_FORMATTER));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(NORM_DATETIME_FORMATTER));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(NORM_DATE_FORMATTER));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(NORM_TIME_FORMATTER));

        SimpleModule longModule = new SimpleModule();
        longModule.addSerializer(Long.class, ToStringSerializer.instance);
        longModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

        jacksonObjectMapperBuilder.modulesToInstall(javaTimeModule, longModule);
    };
}

1.7. 配置 MessageConverter

使用 Jackson2JsonMessageConverter 对消息进行转换,消息采用 JSON 格式传输

@Bean
public MessageConverter messageConverter(ObjectMapper objectMapper) {
    return new Jackson2JsonMessageConverter(objectMapper);
}

1.8. 测试

@Component
@Slf4j
public class SpringRabbitMessageConverterDemo implements ApplicationRunner {

    @Resource
    private RabbitTemplate rabbitTemplate;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        User user = new User(1L, "Jason", LocalDateTime.now());
        rabbitTemplate.convertAndSend(EXCHANGE, null, user);
        log.info("sent a message, payload: {}", user);
    }

    @RabbitListener(queues = {QUEUE})
    public void listen(Message<User> message) {
        log.info(
                "received a message, payload: {}",
                message.getPayload()
        );
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class User {
        private Long id;
        private String name;
        private LocalDateTime birthday;
    }
}

启动程序,控制台将输出以下日志:

sent a message, payload: SpringRabbitMessageConverterDemo.User(id=1, name=Jason, birthday=2024-10-12T16:40:53.088051)
received a message, payload: SpringRabbitMessageConverterDemo.User(id=1, name=Jason, birthday=2024-10-12T16:40:53)

标签:自定义,MessageConverter,Spring,public,javaTimeModule,spring,new,message,class
From: https://www.cnblogs.com/jason207010/p/18460833

相关文章

  • SpringBoot2.x 版本集成elasticsearch 8.x(基于elasticsearch-java)
    上次elasticsearch到8.13.3之后,由于springboot版本2.4.13,jdk版本是11,使用springboot内置的ElasticsearchRestTemplate查询的时候做了兼容性之后虽然代码没有报错了,但是每次查询都会有一个警告[WRAN],如果查询比较频繁的时候日志里面看到的全都是这种警告信息:[ignore_throttle......
  • 自定义 http header 名称中带下划线时,可能会被 nginx 忽略删除
    在设计自定义header时,会发现如user_id这样的header无法被后端读取到想来中间有一层nginx搜了一下果然是它的影响,具体情况就不记录了,可以看参考链接。简单记录是因为下划线可能会导致一些兼容性问题,所以nginx默认不允许header名称带下划线,但也允许手动开启。解决方......
  • SpringMVCUtil工具类
    importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.lvym.exception.NotWebContextException;importcom.lvym.exception.SaSpringBootErrorCode;importorg.springframework.web.context.request.RequestContextH......
  • 【开题报告】基于Springboot+vue同学录网站系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今信息化高速发展的时代,互联网已成为人们日常生活中不可或缺的一部分。随着教育信息化的推进,学生之间的交流与联系逐渐从线下转移到线上。同学录......
  • Springboot --- 使用国内的 AI 大模型 对话
    实在是不知道标题写什么了可以在评论区给个建议哈哈哈哈先用这个作为标题吧尝试使用国内给出的AI大模型做出一个可以和AI对话的网站出来使用智普AI只能在控制台中输出对应的信息不如就做一个maven的项目调用对应的APIhttps://open.bigmodel.cn/dev/api#gl......
  • springboot 项目 统一 返回结果 统一 异常
    统一返回结果统一结果返回目前的前后端开发大部分数据的传输格式都是json,因此定义一个统一规范的数据格式有利于前后端的交互与UI的展示。统一结果的一般形式是否响应成功;响应状态码;状态码描述;响应数据其他标识符统一结果类在项目目录下新建一个common包......
  • Springboot高校学生奖、助学金管理系统t0v2u(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,奖助学金,奖助学金申请,贫困生申请,奖助学金发放,工作类型,勤工助学岗位,岗位申请开题报告内容一、研究背景随着高等教育的普及和学生数量的不断增加,高校......
  • Springboot高校学科竞赛赛事管理1313s(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表评委老师,学生,竞赛类型,竞赛信息,参赛记录,竞赛成绩开题报告内容一、选题背景随着高校教育的快速发展和学科竞赛的日益普及,建立一个高效、便捷、公平的学科竞......
  • Springboot高校失物招领信息平台h8spk(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,物品分类,招领启事,寻物启事开题报告内容一、研究背景与意义在高校中,由于学生人数众多且流动性大,个人物品的遗失事件时有发生。这些失物可能包含有价值的......
  • SpringBoot实战教程:购物推荐网站的设计与实现
    3系统分析3.1可行性分析通过对本东大每日推购物推荐网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。3.1.1技术可行性本东大每日推购物推荐网站采用JAVA作为开发语言,SpringBoot框......