буфер протокола как сообщение поверх активного Mq - PullRequest
2 голосов
/ 24 мая 2011

Я разрабатываю приложение, состоящее из нескольких компонентов, в основном написанных на Java и Python. Я думаю об использовании "JMS-Active MQ" в качестве промежуточного программного обеспечения, ориентированного на сообщения, для компонентов и "буферов протокола".

1) Это хороший путь? В нашем случае «размер сообщения» может превысить 10 МБ, будет ли буфер протокола по-прежнему иметь преимущества для межкомпонентной связи? Существуют ли более эффективные коммуникационные "протоколы" для кроссплатформенных приложений, которые могут обрабатывать "огромные объемы данных"?

2) Я создал Подтверждение концепции моей отправки «положительного результата протокола» в виде сообщения через «ActiveMQ», я использую пример прото-файла в руководстве по java от Google.

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)

Я не знаю, что не так ..?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Что касается 1), в документации буферов протокола говорится о передаче больших сообщений здесь .

О 2), проблема, похоже, заключается в способе передачи book.Посмотрите, как упомянутый вами учебник записывает сообщение в OutputStream.Вместо TextMessage вы должны использовать двоичный , например, записав сначала байты в ByteArrayOutputStream , а затем в сообщение .

1 голос
/ 28 мая 2011

Основная проблема заключается в том, что по какой-то причине вы используете TextMessage вместо правильного выбора BytesMessage: protobuf - это двоичная кодировка, а не текстовая.И если вы абсолютно хотите неправильно использовать TextMessage для нетекстовых сообщений, вы ДОЛЖНЫ указать кодировку, которую следует использовать для getBytes ();и кодирование для использования ДОЛЖНО совпадать с тем, что использовалось для преобразования двоичной полезной нагрузки в байты.И если вы используете UTF-8, вы, вероятно, уже испортили сообщение ... (ISO-8859-1, он же Latin-1 действительно будет работать, потому что это однобайтовая кодировка).

Помимо этого, выможет использовать protobuf, а также любое количество других форматов поверх JMS.Я предпочитаю JSON для удобочитаемости и расширяемости, но если вы уже используете protobuf, а это внутренняя система (не подвержена влиянию внешних сторон), protobuf тоже работает.

...