我正在设计一个具有多个组件的应用程序,主要用 Java 和 Python 编写。 我正在考虑使用 JMS 作为组件和“ Protocol Buffer ”的面向消息的中间件。
这是继续前进的好方法吗?在我们的例子中,“消息大小”可以远远超过 10MB, Protocol Buffer 对于跨组件通信仍然具有优势吗?对于可以处理“海量数据”的跨平台应用程序,是否有更好的通信“协议(protocol)”?
我创建了一个概念证明,发送“协议(protocol)增益”作为消息。我正在使用 google 的 java 教程中的示例 proto 文件。
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),protocol buffers的文档讨论了传输大消息here .
关于2),问题似乎出在您传输书籍
的方式上。
看看如何the tutorial you mention将消息写入 OutputStream。您应该使用 binary one 而不是 TextMessage ,例如首先将字节写入 ByteArrayOutputStream然后到message .
关于protocol-buffers - Protocol Buffer 作为 JMS 上的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106063/