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

如何向Erlang客户端中的RabbitMQ连接传递额外参数,erlang,rabbitmq,ejabberd,Erlang,Rabbitmq,Ejabberd,我为eJabberd编写了一些扩展模块,其中大多数模块出于各种原因将信息传递给RabbitMQ。一切都很好,直到我们在staging中启动服务器,在那里我们有一个Rabbit集群,而不是一个盒子 为了利用集群,您需要使用“all”或“nodes”值将“x-ha-policy”参数传递给兔子。对于Java和Python的生产者和消费者来说,这很好,但是eJabberd(当然使用Erlang AMQP客户机)让我有点困惑。x-ha-policy参数需要传递到“client_properties”参数

我为eJabberd编写了一些扩展模块,其中大多数模块出于各种原因将信息传递给RabbitMQ。一切都很好,直到我们在staging中启动服务器,在那里我们有一个Rabbit集群,而不是一个盒子

为了利用集群,您需要使用“all”或“nodes”值将“x-ha-policy”参数传递给兔子。对于Java和Python的生产者和消费者来说,这很好,但是eJabberd(当然使用Erlang AMQP客户机)让我有点困惑。x-ha-policy参数需要传递到“client_properties”参数中,该参数只是额外参数的“catchall”

在Python和pika中,我可以做到:

client_params = {"x-ha-policy": "all"}
queue.declare(host, vhost, username, password, arguments=client_params)
这就行了。但是,Erlang客户端的文档表示,参数应作为列表传入,具体如下所示:

[{binary(), atom(), binary()}]
如果它只是[{binary(),binary()}],我可以看到与key/value的关系,但不确定原子会是什么


为了清楚起见,我是一个新手Erlang程序员,因此这可能是一个我不熟悉的常见构造,因此没有太明显的答案。

我在
amqp\u network\u 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).
client\u属性(UserProperties)->
{ok,Vsn}=application:get_key(amqp_客户端,Vsn),
默认值=[{,longstr,},
{,longstr,list_to_binary(Vsn)},
{,longstr,},
{laughtr,
},
{laughtr,
},
{,表,?客户端功能}],
列表:foldl(fun({K,{,}=Tuple,Acc)->
列表:密钥库(K、1、Acc、Tuple)
结束、默认、用户属性)。
显然,原子描述了值类型。我不知道可用的类型,但在您的情况下,
longstr
可能会起作用