当我收到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等)。
答案 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));
}