не удалось построить тело в activemq - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу использовать ActiveMQ in. net core, я использую Apache.NMS.ActiveMQ для этого, но у меня проблема. Я вижу эту ошибку в консоли администратора ActiveMQ:

Cannot display ObjectMessage body. Reason: Failed to build body from bytes. Reason: java.io.StreamCorruptedException: invalid stream header: 00010000

Это часть моего кода для этого:

private const String QUEUE_DESTINATION = "test-queue";
private IConnection _connection;
private ISession _session;
public MessageQueue()
{
    IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616?wireFormat.maxInactivityDuration=5000000");
    _connection = factory.CreateConnection();
    _connection.Start();
    _session = _connection.CreateSession();
}
IDestination dest = _session.GetQueue(QUEUE_DESTINATION);
using (IMessageProducer producer = _session.CreateProducer(dest))
{
    var objectMessage = producer.CreateObjectMessage(newDoc);
    producer.Send(objectMessage);
}

1 Ответ

0 голосов
/ 17 февраля 2020

Тот факт, что консоль администратора не может отображать тело ObjectMessage, на самом деле не является ошибкой. Это ожидаемое поведение. Помните, что с точки зрения брокера тело сообщения - это просто массив байтов. Это могут быть текстовые данные (закодированные многими различными способами), данные изображения, пользовательские двоичные данные и т. Д. c. Брокер не знает, как его расшифровать. Он попытается отобразить тело в виде текста, но если он потерпит неудачу, он не попробует ничего другого.

Для ясности, чтобы увидеть содержимое ObjectMessage в веб-консоли должен был бы иметь определение объекта, чтобы десериализовать его. Не существует механизма, позволяющего сообщать веб-консоли о произвольных форматах данных, чтобы она могла надежно десериализовать тела сообщений (кроме простого текста). Это одна из причин, по которой многие избегают ObjectMessage.

Я рекомендую использовать простой текстовый формат (например, JSON, XML) для представления ваших данных и отправки их в вашем сообщении, а не с помощью ObjectMessage .

...