2016-12-06 30 views
1

我使用與Azure Service Bus相關的Rebus創建概念證明,但是我解析放置的消息時存在一些問題來自外部源的隊列。Rebus Azure ServiceBus - 源自外部服務的消息缺少MessageID

我收到錯誤消息:

Received message with empty or absent 'rbs2-msg-id' header!

我已經通過GitHub上一看,發現某人怎麼也有類似的問題,爲的RabbitMQ此房源,並建議使用裝飾:

https://github.com/rebus-org/Rebus/issues/508

但是我不確定如何爲消息ID做到這一點。

一種選擇我已經走了下來,實際上修改Rebus.AzureTransport代碼來做到這一點:

var messageId = headers.GetValueOrNull(Headers.MessageId); 

if (string.IsNullOrEmpty(messageId)) 
{ 
    messageId = Guid.NewGuid().ToString(); 
    headers[Headers.MessageId] = messageId; 
} 

但寧願替代!

我注意到另一件事,是一個BrokeredMessage被放在ASB這樣的:

var message = new BrokeredMessage("<xml>This is a test message: " + DateTime.Now+ "</xml>"); 

它沒有被正確序列化的滷麪接收時。我得到以下錯誤:

Unhandled exception 1 while handling message with ID db13880d-124c-4ed5-993e-96faeca0f140: System.Collections.Generic.KeyNotFoundException: Could not find the key 'rbs2-content-type'

通過重寫串行器,該underdying消息跨越如來:

@strin3http://schemas.microsoft.com/2003/10/Serialization/?6This is a test message: 06/12/2016 07:44:21

,所以我不知道我做錯了。

在此先感謝。

回答

0

那麼......正如錯誤消息所述,傳入的消息沒有包含足夠的信息以便Rebus處理它。此外,Rebus的Azure服務總線傳輸要求將郵件內容作爲Stream發送,以避免將包含的字節封裝在XML結構中的成本(這是Azure服務總線驅動程序默認執行的操作) 。

如果我是你,我可能不會使用Rebus從不包含由Rebus發送的消息的隊列接收消息。或者,我可能會這麼做 - 但前提是傳入的消息很容易適應Rebus格式。

雖然做到這一點可能有點麻煩,因爲 - 正如您已經正確觀察到的那樣 - 它需要某些標題存在,這對Rebus提示如何在處理嘗試之間跟蹤它,如何反序列化,在這裏回覆,如果bus.Reply被調用,等等。所以我仍然可能最終沒有這樣做呢:)

我建議你做這樣的事情:

while(true) 
{ 
    var message = GetNextMessageOrNullFromQueue(); 

    if (message == null) continue; 

    UnwrapMessageAndSendWithRebusToRebusQueue(message); 
} 

這樣編碼你自己接收循環以接收您的自定義格式的Azure服務總線消息,委託其實際處理(也可能將XML文本反序列化爲對象?)到一個Rebus端點。

這通常是與外部事物集成的首選方式,因爲它保持了在應用程序的外部和內部之間來回橋接的邏輯,而不是泄露到應用程序中。

+0

嗨,感謝您的回覆。我將研究進行接收循環的可行性。有一件事我不確定,爲什麼當我覆蓋序列化程序(我在你的ReceiveNonRebusMessageWithRabbitMq例子中使用了Utf8Fallback串行程序)時,會從隊列中錯誤地選擇消息。我會認爲它會被正確解析? – jazzyuk

相關問題