首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RocketMq消息转换器对于LocalDateTime的处理

RocketMq消息转换器对于LocalDateTime的处理

原创
作者头像
用户3293499
修改2025-01-24 07:33:31
修改2025-01-24 07:33:31
1920
举报
文章被收录于专栏:Java杂谈Java杂谈Spring杂谈

RocketMq消息转换器对于LocalDateTime的处理

RocketMq默认的消息转化器不能对LocalDateTime等java8新提供的时间对象进行转换。根据错误信息,发现使用的是Jackson,看源码RocketMQAutoConfiguration

代码语言:java
复制
    @Bean(destroyMethod = "destroy")

    @Conditional(ProducerOrConsumerPropertyCondition.class)

    @ConditionalOnMissingBean(name = ROCKETMQ\_TEMPLATE\_DEFAULT\_GLOBAL\_NAME)

    public RocketMQTemplate rocketMQTemplate(RocketMQMessageConverter rocketMQMessageConverter) {

        RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();

        if (applicationContext.containsBean(PRODUCER\_BEAN\_NAME)) {

            rocketMQTemplate.setProducer((DefaultMQProducer) applicationContext.getBean(PRODUCER\_BEAN\_NAME));

        }

        if (applicationContext.containsBean(CONSUMER\_BEAN\_NAME)) {

            rocketMQTemplate.setConsumer((DefaultLitePullConsumer) applicationContext.getBean(CONSUMER\_BEAN\_NAME));

        }

        rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter());

        return rocketMQTemplate;

    }

可以看到使用的默认消息转化器是rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter());,继续跟踪

代码语言:java
复制
public class RocketMQMessageConverter {



    private static final boolean JACKSON\_PRESENT;

    private static final boolean FASTJSON\_PRESENT;



    static {

        ClassLoader classLoader = RocketMQMessageConverter.class.getClassLoader();

        JACKSON\_PRESENT =

            ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", classLoader) &&

                ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", classLoader);

        FASTJSON\_PRESENT = ClassUtils.isPresent("com.alibaba.fastjson.JSON", classLoader) &&

            ClassUtils.isPresent("com.alibaba.fastjson.support.config.FastJsonConfig", classLoader);

    }



    private final CompositeMessageConverter messageConverter;



    public RocketMQMessageConverter() {

        List<MessageConverter> messageConverters = new ArrayList<>();

        ByteArrayMessageConverter byteArrayMessageConverter = new ByteArrayMessageConverter();

        byteArrayMessageConverter.setContentTypeResolver(null);

        messageConverters.add(byteArrayMessageConverter);

        messageConverters.add(new StringMessageConverter());

        if (JACKSON\_PRESENT) {  /// 如果有jackson,则加载jackson,但是没有支持jsr30

            MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();

            ObjectMapper mapper = converter.getObjectMapper();

            mapper.disable(SerializationFeature.WRITE\_DATES\_AS\_TIMESTAMPS);

            mapper.registerModule(new JavaTimeModule());

            converter.setObjectMapper(mapper);

            messageConverters.add(converter);

        }

        if (FASTJSON\_PRESENT) { /// 如果有fastjson

            try {

                messageConverters.add(

                    (MessageConverter)ClassUtils.forName(

                        "com.alibaba.fastjson.support.spring.messaging.MappingFastJsonMessageConverter",

                        ClassUtils.getDefaultClassLoader()).newInstance());

            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException ignored) {

                //ignore this exception

            }

        }

        messageConverter = new CompositeMessageConverter(messageConverters);

    }



    public MessageConverter getMessageConverter() {

        return messageConverter;

    }



}

找到问题就好处理了,无非两种思路:

1、对jackson进行处理

2、直接移除jackson,只用fastjson

我习惯了使用fastjson,因此采用第二个方法,增加配置如下:

代码语言:java
复制
 @Bean

    public RocketMQTemplate rocketMQTemplate(RocketMQMessageConverter rocketMQMessageConverter) {

        RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();

        if (applicationContext.containsBean(RocketMQAutoConfiguration.PRODUCER\_BEAN\_NAME)) {

            rocketMQTemplate.setProducer((DefaultMQProducer) applicationContext.getBean(RocketMQAutoConfiguration.PRODUCER\_BEAN\_NAME));

        }

        if (applicationContext.containsBean(RocketMQAutoConfiguration.CONSUMER\_BEAN\_NAME)) {

            rocketMQTemplate.setConsumer((DefaultLitePullConsumer) applicationContext.getBean(RocketMQAutoConfiguration.CONSUMER\_BEAN\_NAME));

        }

        CompositeMessageConverter cv = (CompositeMessageConverter)rocketMQMessageConverter.getMessageConverter();

        for(int i=0;i<cv.getConverters().size();i++)

        {

            MessageConverter mc = cv.getConverters().get(i);

            /// 移除jackson

            if(mc.getClass()==MappingJackson2MessageConverter.class){

                cv.getConverters().remove(i);

                break;

            }

        }

        rocketMQTemplate.setMessageConverter(cv);

        return rocketMQTemplate;

    }



}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档