使用Java客户端向Apache Pulsar传输的数据显示为编码格式是什么原因
问题根因
你使用Schema.AVRO(DavisMessage.class)序列化自定义对象时,Pulsar会按照AVRO二进制编码规则将对象写入消息体:
- 数值类型(float、short等)会被序列化为二进制字节,直接查看原始字节内容时就会显示为乱码
- 字符串类型按照UTF-8编码写入,所以你可以直接识别到消息里的字符串内容
解决方案
1. 消费端使用对应AVRO Schema反序列化
消费时指定和生产者完全一致的AVRO Schema,即可直接解析出完整的DavisMessage结构化对象,参考代码:
Consumer<DavisMessage> consumer = client.newConsumer(Schema.AVRO(DavisMessage.class)) .topic(topic) .subscriptionName("你的订阅名") .subscribe(); Message<DavisMessage> msg = consumer.receive(); DavisMessage parsedData = msg.getValue(); // 直接读取parsedData的各个字段即可
2. 命令行查看消息时指定Schema解析
如果是用pulsar-client命令行工具查看消息,加上-s avro参数即可自动解析AVRO格式的消息:
pulsar-client consume 你的Topic名称 -s 订阅名称 -n 1 -s avro
3. 需直接查看明文可更换序列化协议
如果你的业务场景需要直接查看消息明文,可以将序列化协议更换为JSON:
// 生产者初始化时替换Schema配置即可 Producer<DavisMessage> producer = client.newProducer(Schema.JSON(DavisMessage.class)) .topic(topic) .create();
更换后消息体为可读的JSON字符串,直接查看不会出现乱码,但存储空间占用会高于AVRO编码。
内容的提问来源于stack exchange,提问作者Saverio Guzzo
相关产品推荐
相关产品推荐

