2013-06-12 40 views
2

當我收到ActiveMQBytesMessage時,Content屬性具有與期望的長度完全相同的長度,但所有字節均爲零,它看起來像只有正確長度的未初始化緩衝區。接收到的ActiveMQBytesMessage中的內容爲空

我也嘗試過ReadBytes(buffer, length)上的消息對象,並得到了相同的空緩衝區。

我敢肯定,這些消息準確到達經紀人,因爲我可以考慮通過ActiveMQ的Web界面消息的XML表示,在那裏我可以看到<content><data>

正確的Base64表示我正在使用最新版本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

嘗試添加一些實際的代碼和/或更多細節。這裏沒有足夠的真正幫助你。 –

+0

非常感謝您的快速響應!你能從更新的問題中獲得足夠的細節嗎?處理連接,發佈者,消費者,會話等應該沒問題,因爲解決方案已經成功處理了數百萬條短信:)此問題僅出現在字節消息中。 – realMarkusSchmidt

回答

2

我相信這是按照其目前的設計。內容字段被讀取並通過第一次調用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)); 
} 
+0

非常感謝你,那就是訣竅:)只要你有機會在未來做一個API重構,我會建議通過緩衝區來支持這個屬性,或者不是隻提供一個屬性,而是隻提供'ReadBytes'使這種行爲有點更期待。根據「微軟物業設計指引」,物業不應「產生副作用」。 「屬性獲得者應該是沒有任何先決條件的簡單操作。」 ;) http://msdn.microsoft.com/en-us/library/ms229006(v=vs.80).aspx – realMarkusSchmidt

+0

我不是微軟的粉絲,所以我一般不會遵循他們的指導方針。如果您想進行一些改進,請打開項目的問題並附上補丁和測試。 –

相關問題