RocketMq消息转换器对于LocalDateTime的处理
RocketMq默认的消息转化器不能对LocalDateTime等java8新提供的时间对象进行转换。根据错误信息,发现使用的是Jackson
,看源码RocketMQAutoConfiguration
@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());
,继续跟踪
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,因此采用第二个方法,增加配置如下:
@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 删除。