2013-10-16 10 views
6

Ich versuche, eine Nachricht mit Metadaten über die Erlang client zu senden, und ich kann nicht verstehen, wie ich benutzerdefinierte Anwendungsheader im Basiseigenschaftensatz der Nachricht festlegen soll. Ich habe ohne Erfolg all diese Möglichkeiten versucht:Wie verwendet man Nachrichten Header in RabbitMQ Erlang Client?

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

Es scheint, dass Header einige spezielle Datenstruktur verwenden, ein AMQP Tisch - aber ich konnte keine Dokumentation oder Beispiele zu diesem Thema finden.

Was ist eine korrekte Möglichkeit, eine Nachricht mit Kopfzeilen zu senden?

Update: A stack trace (tatsächlich ist es nicht relevant - die Ursache für diesen Fehler ist, die geräuschlos geschlossenen Kanal) und der Source code.

Antwort

5

Haben Sie Fehler beim Senden von Nachrichten mit Kopfzeilen?

Haben Sie versucht, den Stringtyp für Schlüssel und Wert zu verwenden?

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

Update: suchte ich den Quellcode des Pakets rabbit_common und ich fand Typ etwas über Header aus. Es gibt eine Art Header() in rabbit_basic.erl:

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

Und es gibt Definition der Typen in Modul 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 
    ). 

So ist der Header ist ein Tupel von drei Elemente (nicht zwei) , die binär sind, Art von Wert, Wert. So müssen Sie wie, dass jeder Kopf die Art und Weise definieren:

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

ich einen Stack-Trace auf die Frage hinzugefügt haben - aber es würde nicht helfen, ich glaube, weil ein AMQP Kanal schließt gerade abrupt nach einem ‚Grunde .publish 'Anruf. Ein Typ eines Wertes macht auch keinen Unterschied - ich habe Strings und Integer versucht. – NikitaBaksalyar

+0

Danke - es funktioniert perfekt! Es ist seltsam, dass dieses Verhalten nicht gut dokumentiert ist. – NikitaBaksalyar

Verwandte Themen