2010-04-20 68 views
1

我使用的服務停用發送類MyMusicMessage的目的吹塑:NServiceBus發送數據的問題

[Serializable] 
public class MyMusicMessage:IMessage 
{ 
    public Guid EventId { set; get; } 
    public byte[] MusicBytes { set; get; } 
} 

當MusicBytes的尺寸約200K,它可以被髮送很好。

但是當大小超過300K時,會出現「MessageQueueException」。

NServiceBus中的對象大小是否有限制?

謝謝。

回答

0

MSMQ的限制爲4M。我們正在開發一個2.1版的數據總線功能,但在此之前,我會提醒您將您的音樂有效載荷「帶外」存儲起來,並且只傳輸地址,以便在您的消息中提取數據。

希望這會有所幫助!

+0

謝謝你,Andreas 在我的應用程序中,我必須直接傳送MusicBytes。 我期待更多的幫助。 – Alidaswe 2010-04-20 12:47:24

+0

您能否詳細說明數據必須與消息一起傳輸的原因? – 2010-04-20 13:16:11

1

當在NServiceBus中使用XML序列化程序(這是默認設置)時,它會將數組序列化爲通用集合,爲每個值創建一個條目。這可能是導致實際消息大小比內存中的300KB大得多的原因。

我建議你切換到該消息類型的二進制序列化程序。

2

一兩件事我注意到轉移(小得多)有效載荷時,作爲一個字節數組是NServiceBus將大致序列像這樣(從內存中):

<MyByteArray> 
    <Byte>4</Byte> 
    <Byte>183</Byte> 
    <Byte>221</Byte> 
    <Byte>87</Byte> 
    ... 
<MyByteArray> 

顯然不轉讓一個偉大的方式一個字節數組有效,但我相信NServiceBus串行器正在提高速度和效率,而不是最小的消息大小。

雖然我同意最好轉移一些與音樂數據一樣大的帶外,但對於較小的字節數組有效載荷(如5-10K範圍),更好的選擇是將字節數組編碼爲Base64字符串在您的消息類使用Convert.ToBase64String(byte[] arr)Convert.FromBase64String(string str)