如何在Erlang客户端中向RabbitMQ连接传递额外的参数

时间:2012-06-17 13:43:49

标签: erlang rabbitmq ejabberd

我已经为eJabberd编写了一些扩展模块,其中大部分都是出于各种原因将信息传递给RabbitMQ。一切都很好,直到我们把服务器带到了我们有一个Rabbit集群而不是一个盒子的阶段。

为了利用群集,您需要使用“all”或“nodes”值将“x-ha-policy”参数传递给Rabbit。这适用于Java和Python生产者和消费者,但eJabberd(当然使用Erlang AMQP客户端)让我有点难过。需要将x-ha-policy参数传递给“client_properties”参数,该参数只是额外参数的“catchall”。

在Python中使用鼠兔我可以做到:

client_params = {"x-ha-policy": "all"}
queue.declare(host, vhost, username, password, arguments=client_params)

这是有效的。但是,Erlang客户端的文档说,参数应该作为列表传递:

[{binary(), atom(), binary()}]

如果它只是[{binary(),binary()}]我可以看到与键/值的关系,但不知道原子会在那里。

为了清楚起见,我是Erlang的新手程序员,所以这可能是一个我不熟悉的常见结构,所以答案不会太明显。

1 个答案:

答案 0 :(得分:2)

我在amqp_network_connection.erl中找到了这个,它看起来像是一个设置默认值的包装器:

client_properties(UserProperties) ->
    {ok, Vsn} = application:get_key(amqp_client, vsn),
    Default = [{<<"product">>,   longstr, <<"RabbitMQ">>},
               {<<"version">>,   longstr, list_to_binary(Vsn)},
               {<<"platform">>,  longstr, <<"Erlang">>},
               {<<"copyright">>, longstr,
                <<"Copyright (c) 2007-2012 VMware, Inc.">>},
               {<<"information">>, longstr,
                <<"Licensed under the MPL.  "
                  "See http://www.rabbitmq.com/">>},
               {<<"capabilities">>, table, ?CLIENT_CAPABILITIES}],
    lists:foldl(fun({K, _, _} = Tuple, Acc) ->
                    lists:keystore(K, 1, Acc, Tuple)
                end, Default, UserProperties).

显然,atom描述了值类型。我不知道可用的类型,但longstr可能适用于您的情况。