2013-06-12 2 views
2

Когда я получаю ActiveMQBytesMessage, свойство Content имеет точно ожидаемую длину, но все байты равны нулю, он выглядит как неинициализированный буфер с правильной длиной.Содержимое в полученном ActiveMQBytesMessage пусто

Я также пробовал ReadBytes(buffer, length) на объект сообщения и получил тот же пустой буфер.

Я уверен, что сообщения поступают правильно у брокера, потому что я могу смотреть в XML-представление сообщения через веб-интерфейс ActiveMQ, и я могу видеть правильное представление Base64 в <content><data>

Я использую последнюю версию 1.5.6.

Любые идеи, что я могу делать неправильно?

Update

Как создать сообщение перед его отправкой с помощью издателя:

var binMessage = new ActiveMQBytesMessage(); 
binMessage.Content = /* ... */ 

Это то, что сообщение выглядит как на веб-интерфейс (браузер очередей):

<org.apache.activemq.command.ActiveMQBytesMessage> 
    <commandId>5</commandId> 
    <!-- ... --> 
    <content> 
    <data>H4sIAN[...]AA=</data> 
    <offset>0</offset> 
    <length>305</length> 
    </content> 
    <!-- ... --> 
</org.apache.activemq.command.ActiveMQBytesMessage> 

Это то, что я в основном делаю в своих MessageListener:

Console.WriteLine("Message ID: " + message.NMSMessageId); 
var bytesMessage = message as IBytesMessage; 
if (bytesMessage != null) 
{ 
    Console.WriteLine("Content length: " + bytesMessage.Content.Length); 
    Console.WriteLine("Content: " + BitConverter.ToString(bytesMessage.Content)); 
} 

Это дает мне правильную длину содержимого, но фактическое содержимое просто пусто (шестнадцатеричный выход равен 00-00-00 и т. Д.).

+0

Попробуйте добавить реальный код или более подробную информацию. Здесь недостаточно, чтобы действительно помочь вам. –

+0

Большое спасибо за ваш быстрый ответ! Можете ли вы получить достаточно информации из обновленного вопроса? Обработка соединений, издателей, потребителей, сеансов и т. Д. Должна быть прекрасной, так как решение уже успешно обработало много миллионов текстовых сообщений :) Эта проблема возникла только при использовании Bytes Message. – realMarkusSchmidt

ответ

2

Я считаю, что это работает в настоящее время. Поле «Содержимое» считывается и возвращается вам первым вызовом Content, в котором отображается длина. На этом этапе сообщение теперь считывается до конца потока данных. Прежде чем вы сможете снова вызвать контент и перечитать данные, необходимые для сброса сообщения.

Что-то вроде этого должно работать.

Console.WriteLine("Message ID: " + message.NMSMessageId); 
var bytesMessage = message as IBytesMessage; 
if (bytesMessage != null) 
{ 
    byte[] content = bytesMessage.Content; 
    Console.WriteLine("Content length: " + content.Length); 
    Console.WriteLine("Content: " + BitConverter.ToString(content)); 
} 
+0

Большое спасибо, что сделал трюк :) Просто, если у вас появится возможность сделать рефакторинг API в будущем, я бы предложил вернуть свойство буфером или вместо свойства предложить только «ReadBytes», которые делает это поведение немного более ожидаемым. В соответствии с «Руководством по дизайну собственности Microsoft» свойства не должны «создавать побочные эффекты». «Убиратели собственности должны быть простыми операциями без каких-либо предварительных условий». ;) http://msdn.microsoft.com/en-us/library/ms229006(v=vs.80).aspx – realMarkusSchmidt

+0

Я не поклонник Microsoft, поэтому я обычно не следую их рекомендациям. Если вам нужны некоторые улучшения, откройте проблему с проектом и приложите исправление и тесты. –