我不會使用您正在嘗試執行的操作。在我看來,這些信息屬於信息的正文。
看看這樣說:
消息的主體應該包含您需要完成要求的工作一切。在這種情況下,它將是發件人,主題,電子郵件內容等。
另一方面,標題是有關AMQP消息的數據位,而不是消息內容。
這裏有很多潛在的困惑與你的工作做「電子郵件」。 AMQP消息與電子郵件之間的術語重疊太多。
這樣說,我會選擇一個不同的工作示例:計算fibonacci序列。
在這種情況下,您通過rabbitmq發送的消息將包含諸如先前計算多少斐波那契位置以及之後要發送多少位的信息。
例如,你可能會(在這種情況下,JSON)發送類似這樣的消息:
{
start: 1,
take: 3
}
,因爲它會在第一個位置,並返回從序列3項本應產生的1, 1, 2
結果。
使用您的具體問題和邏輯:我應該將start
和take
屬性放入消息的標題中嗎?
沒有。
如果我這樣做,那意味着我的消息是空的,因爲所有關於要完成的工作的信息都將包含在標題中。
當我以這種方式觀察它時沒有任何意義,因爲現在沒有要發送的消息...只有標題。另一方面,如果我在消息正文中保留這兩點數據,則頭文件將變得更加有用,因爲它可以發送關於AMQP消息本身的元數據......而不是有關消息內容的信息,但關於消息的想法的信息。
在這種情況下,我說我想從斐波那契序列返回項目。換句話說,我參與了RPC(遠程過程調用)並期望返回值。
AMQP不直接支持返回值。然而,我可以做的是在隊列中填入隊列名稱並將結果發送到隊列中。那麼請求斐波納契數字的代碼可以監聽該隊列並獲得結果。
所以我可能會在發送消息時,做這樣的事情:
var properties = new BasicProperties();
properties.Headers = new Dictionary();
properties.Headers.Add("return-queue", "fibreturn");
這裏我設置了一個「返回隊列」頭 - 對消息或請求信息在這種情況下的信息 - 在標題裏面。處理fibonacci序列的代碼將讀取此頭並將響應發送回該隊列。
這是一個更好的使用標題,因爲它使標題存儲有關消息的信息......在這種情況下,應發送響應。儘管如此,標題並不包含有關要完成的實際工作的信息。即全部直接存儲在消息體中。
p.s.我故意不使用像您通常應該那樣的「回覆」屬性來執行RCP。我以此爲例說明爲什麼你不應該把你的「目標」放在標題中。爲了更好地實現斐波那契序列的想法,請參閱RMQ文檔以及它如何正確使用「回覆」https://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html