4

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

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

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

我正在使用最新版本 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 等)。

4

1 回答 1

3

我相信这是按照目前的设计工作的。第一次调用显示长度的 Content 时会读取 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));
}
于 2013-06-12T22:39:12.257 回答