协议缓冲区作为活动Mq上的消息

| 我正在设计一个具有多个组件的应用程序,主要用java和python编写。 我正在考虑将“ JMS-Active MQ”用作组件和“协议缓冲区”的面向消息的中间件。 1)是前进的好方法吗?在我们的例子中,“消息大小”可以超过10MB,协议缓冲区在跨组件通信方面是否仍然具有优势?对于可以处理“大量数据”的跨平台应用程序,是否有更好的通信“协议”? 2)我创建了一个概念证明,通过Google Active Directory中的示例协议文件,通过“ ActiveMQ \”发送了一个“协议消息”作为消息。
AddressBook.Builder book = AddressBook.newBuilder();
Person.Builder person = Person.newBuilder();
person.setName(\"mayank\");
person.setId(2);
book.addPerson(person); 
TextMessage message = session.createTextMessage();
message.setText(book.build().toString());
在另一个Java应用程序中,我听了此消息,并尝试将其反序列化回AddressBook对象:
public void onMessage(Message message) {
    TextMessage msg = (TextMessage) message;
    try {
        System.out.println(msg.getText());
        CodedInputStream stream =CodedInputStream.newInstance(msg.getText().getBytes());
        AddressBook book = AddressBook.parseFrom(stream);
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}
这将导致异常:
com.google.protobuf.InvalidProtocolBufferException: While parsing a protocol 
  message, the input ended unexpectedly in the middle of a field.  This could 
  mean either than the input has been truncated or that an embedded message 
  misreported its own length.
at com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:49)
我不知道怎么了..?     
已邀请:
关于1),协议缓冲区的文档在此处讨论了如何传输大消息。 关于2),问题似乎出在您转移
book
的方式上。 看一下您提到的教程如何将消息写到OutputStream。而不是TextMessage,您应该使用二进制的,例如,首先将字节写入ByteArrayOutputStream,然后再写入消息。     
主要问题是由于某种原因,您正在使用TextMessage而不是BytesMessage的正确选择:protobuf是二进制编码,而不是文本编码。 而且,如果您绝对想将TextMessage误用于非文本消息,则必须指定用于getBytes()的编码;和编码以使用时必须匹配将二进制有效载荷转换为字节的任何内容。而且,如果您使用UTF-8,则可能已经损坏了消息...(ISO-8859-1,又名Latin-1实际上可以工作,因为它是单字节编码)。 除此之外,您还可以在JMS上使用protobuf以及任何其他格式。我更喜欢JSON以提高可读性和可扩展性,但是如果您已经在使用protobuf,并且这是内部系统(不是暴露于外部各方的东西),protobuf也可以使用。     

要回复问题请先登录注册