收到的ActiveMQBytesMessage中的内容为空

时间:2013-06-12 17:29:12

标签: activemq nms

当我收到ActiveMQBytesMessage时,Content属性具有完全预期的长度,但所有字节都为零,它看起来像一个未初始化的缓冲区,长度正确。

我还在消息对象上尝试了ReadBytes(buffer, length),并获得了相同的空缓冲区。

我很确定消息正确地到达代理,因为我可以通过ActiveMQ Web界面查看消息的XML表示,我可以在<content><data> <中看到正确的Base64表示/ p>

我使用的是最新版本1.5.6。

任何想法我可能做错了什么?

更新

如何在使用发布商发送消息之前创建消息:

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

这是Web界面(队列浏览器)上的消息:

<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等)。

1 个答案:

答案 0 :(得分:3)

我相信这是目前设计的。首先调用Content,然后显示长度,将读取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));
}