如何在RabbitMQ的Erlang客户端中使用消息头?

时间:2013-10-16 16:26:02

标签: erlang rabbitmq

我正在尝试通过Erlang client发送包含元数据的消息,我无法理解如何在消息的基本属性记录中设置自定义应用程序标头。我已经尝试了所有这些选项但没有成功:

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

看来标题使用了一些特殊的数据结构,一个AMQP表 - 但我找不到任何关于此事的文档或示例。

使用标头发送邮件的正确方法是什么?

更新stack trace(实际上,它不相关 - 该错误的原因是无声关闭的频道)和来源code

1 个答案:

答案 0 :(得分:5)

尝试使用标头发送邮件时是否有任何错误?

您是否尝试将字符串类型用于键和值?

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

更新:我调查了包rabbit_common的源代码,我发现了一些关于header'类型的内容。 rabbit_basic.erl中有一个类型headers():

-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}.