2013-10-16 43 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

相关问题