Closed fenfeiyunluo closed 9 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,能提供更详细的信息吗
我测试了一下, 确认在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.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版本已经修改
依赖名称: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); }