Linyuzai / concept

封装了一些常用组件,走过路过不要错过哦
Apache License 2.0
416 stars 122 forks source link

使用RABBIT_FANOUT转发消息解析异常 #26

Closed fenfeiyunluo closed 9 months ago

fenfeiyunluo commented 10 months ago

依赖名称:concept-netty-loadbalance-spring-boot-starter

依赖版本:2.3.0 、 2.3.2

问题描述:使用rabbimq转发UserMessage消息 BaseMessageCodecAdapter.getForwardMessageDecoder 方法下的 JacksonForwardMessageDecoder.readTree(Object message)抛出异常。mq转发消息Object message 类型(org.springframework.amqp.core.Message)

代码示例: 修复重写方法: @SneakyThrows protected JsonNode readTree(Object message) { if (message instanceof String strMessage) { return objectMapper.readTree(strMessage); } if (message instanceof Message mqMessage) { return objectMapper.readTree((mqMessage.getBody())); } if (message instanceof ByteBuffer byteBuffer) { return objectMapper.readTree(byteBuffer.array()); } if (message instanceof byte[]) { return objectMapper.readTree((byte[]) message); } throw new MessageDecodeException(message); }

Linyuzai commented 10 months ago

依赖名称:concept-netty-loadbalance-spring-boot-starter

依赖版本:2.3.0 、 2.3.2

问题描述:使用rabbimq转发UserMessage消息 BaseMessageCodecAdapter.getForwardMessageDecoder 方法下的 JacksonForwardMessageDecoder.readTree(Object message)抛出异常。mq转发消息Object message 类型(org.springframework.amqp.core.Message)

代码示例: 修复重写方法: @SneakyThrows protected JsonNode readTree(Object message) { if (message instanceof String strMessage) { return objectMapper.readTree(strMessage); } if (message instanceof Message mqMessage) { return objectMapper.readTree((mqMessage.getBody())); } if (message instanceof ByteBuffer byteBuffer) { return objectMapper.readTree(byteBuffer.array()); } if (message instanceof byte[]) { return objectMapper.readTree((byte[]) message); } throw new MessageDecodeException(message); }

我这边 2.3.2 没有复现,rabbitmq message 的处理在 RabbitMessageCodecAdapter,能提供更详细的信息吗

fenfeiyunluo commented 10 months ago

我测试了一下, 确认在2.3.2中没有复现了。另外提一个改进的小建议:同一个类的decode 方法的else逻辑, 如果传递的是json字符串, jar中使用的payloadNode.asText() 方法会传递为空字符串, 建议的改进如下: TextMessage decoded = new TextMessage(); decoded.setHeaders(headers); if (payloadNode.isTextual()) { decoded.setPayload(payloadNode.asText()); } else if (payloadNode.isObject()) { decoded.setPayload(payloadNode.toString()); } return decoded; 判断传递的是字符串还是对象, 进行分别处理。

Linyuzai commented 9 months ago

我测试了一下, 确认在2.3.2中没有复现了。另外提一个改进的小建议:同一个类的decode 方法的else逻辑, 如果传递的是json字符串, jar中使用的payloadNode.asText() 方法会传递为空字符串, 建议的改进如下: TextMessage decoded = new TextMessage(); decoded.setHeaders(headers); if (payloadNode.isTextual()) { decoded.setPayload(payloadNode.asText()); } else if (payloadNode.isObject()) { decoded.setPayload(payloadNode.toString()); } return decoded; 判断传递的是字符串还是对象, 进行分别处理。

2.3.3版本已经修改