Pub/Sub Emulator使用通用Proto Buffer库收发二进制消息失效问题咨询
问题根因
你的消费逻辑依赖了仅当Pub/Sub Topic绑定Schema时才会由云端服务端自动注入的googclient_schemaencoding属性,而Pub/Sub模拟器不支持Schema相关能力,不会自动添加该属性,导致代码直接跳出switch分支,没有执行Proto二进制反序列化步骤,看起来就像功能失效。
Pub/Sub模拟器的Schema限制仅指不支持服务端的Schema绑定、校验、自动注入属性等能力,完全支持传递任意二进制字节流,你可以在本地自行实现Proto的序列化/反序列化,不需要依赖服务端Schema能力。
解决方案
方案1:移除不必要的编码判断逻辑(推荐,符合你仅使用Proto二进制的需求)
直接对收到的ByteString执行反序列化即可,修改消费端MessageReceiver逻辑:
MessageReceiver receiver = (PubsubMessage message, AckReplyConsumer consumer) -> { ByteString data = message.getData(); try { OnfidoVerificationEvent state = OnfidoVerificationEvent.parseFrom(data); System.out.println("Received proto message: " + state); } catch (InvalidProtocolBufferException e) { e.printStackTrace(); } consumer.ack(); System.out.println("Ack'ed the message"); };
方案2:兼容原有逻辑,发布时手动添加编码属性
如果你需要保留原有编码判断逻辑同时兼容模拟器,只需要在发布消息时手动添加对应属性即可,修改publishProtoMessageTest方法中的消息构建逻辑:
PubsubMessage.Builder message = PubsubMessage.newBuilder(); message.setData(onfidoVerificationEvent.toByteString()); // 手动添加编码属性,兼容原有判断逻辑 message.putAttributes("googclient_schemaencoding", "BINARY"); System.out.println("Publishing a BINARY-formatted message:\n" + message);
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

