2013-10-16 89 views
6

我試圖通過Erlang client發送帶有元數據的消息,但我無法理解應該如何在消息的基本屬性記錄中設置自定義應用程序標頭。我試過沒有成功所有這些選項:如何在RabbitMQ的Erlang客戶端中使用消息頭?

#'P_basic'{headers = [{<<"key">>, <<"value">>}]} 
#'P_basic'{headers = [{"key", <<"value">>}]} 
#'P_basic'{headers = [{key, <<"value">>}]} 

看來頭使用一些特殊的數據結構,AMQP表 - 但我找不到對此事的任何文檔或例子。

什麼是使用標題發送郵件的正確方法?

更新:一個stack trace(實際上,這是不相關的 - 這個錯誤的原因是默默的封閉通道)和源code

回答

5

您是否嘗試使用標題發送郵件時遇到任何錯誤?

您是否嘗試爲鍵和值使用字符串類型?

#'P_basic'{headers = [{"key", "value"}]} 

更新:我調查了包rabbit_common的源代碼,我發現了一些關於頭型。有一種類型的報頭()在rabbit_basic.erl:

-type(headers() :: rabbit_framing:amqp_table() | 'undefined'). 

而且有模塊rabbit_framing_amqp類型的定義:

-type(amqp_field_type() :: 
     'longstr' | 'signedint' | 'decimal' | 'timestamp' | 
     'table' | 'byte' | 'double' | 'float' | 'long' | 
     'short' | 'bool' | 'binary' | 'void' | 'array'). 
-type(amqp_property_type() :: 
     'shortstr' | 'longstr' | 'octet' | 'shortint' | 'longint' | 
     'longlongint' | 'timestamp' | 'bit' | 'table'). 

-type(amqp_table() :: [{binary(), amqp_field_type(), amqp_value()}]). 
-type(amqp_array() :: [{amqp_field_type(), amqp_value()}]). 
-type(amqp_value() :: binary() | % longstr 
         integer() | % signedint 
         {non_neg_integer(), non_neg_integer()} | % decimal 
         amqp_table() | 
         amqp_array() | 
         byte() |  % byte 
         float() |  % double 
         integer() | % long 
         integer() | % short 
         boolean() | % bool 
         binary() | % binary 
         'undefined' | % void 
         non_neg_integer() % timestamp 
    ). 

所以標題是三個項目的元組(而不是兩個) ,它是二進制的,值的類型,值。所以,你必須定義每個標題這樣的方式:

BooleanHeader = {<<"my-boolean">>, bool, true}. 
StringHeader = {<<"my-string">>, longstr, <<"value">>}. 
IntHeader = {<<"my-int">>, long, 1000}. 
+0

我添加了一個堆棧跟蹤的問題 - 但它不會幫助,我相信,因爲AMQP通道只需經過「基本突然關閉.publish'調用。一種類型的值也沒有區別 - 我嘗試了字符串和整數。 – NikitaBaksalyar

+0

謝謝 - 它完美的作品!奇怪的是,這種行爲沒有很好地記錄。 – NikitaBaksalyar

相關問題