protocol-buffers - Protocol Buffer 作为 JMS 上的消息

标签 protocol-buffers jms

我正在设计一个具有多个组件的应用程序,主要用 Java 和 Python 编写。 我正在考虑使用 JMS 作为组件和“ Protocol Buffer ”的面向消息的中间件。

  1. 这是继续前进的好方法吗?在我们的例子中,“消息大小”可以远远超过 10MB, Protocol Buffer 对于跨组件通信仍然具有优势吗?对于可以处理“海量数据”的跨平台应用程序,是否有更好的通信“协议(protocol)”?

  2. 我创建了一个概念证明,发送“协议(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/

相关文章:

maven - protobuf-maven-plugin 编译为 golang

serialization - Microsoft 的 Bond 和 Google 的 Protocol Buffers 之间的区别

c++ - 从 C++ 访问 Protocol Buffer 扩展重复字段

java - 将字符串转换为 javax.jms.Message

java - 将 Spring MVC 的 Controller 与 HTTPServlet 解耦

java - 限制读取的消息队列

java - 为 MessageListener 调用 stop() 并暂时暂停连接传入消息的传递的正确位置。(JMSCC0012..)?

java - Akka grpc 可以消费非 Akka 服务的数据吗

C++ Google Protocol Buffer 打开 http 套接字

java - 从 Weblogic Server DEQUEUE Oracle 高级队列