2012-06-17 27 views
1

我已经为eJabberd编写了一些扩展模块,其中大多数扩展模块因为各种原因向RabbitMQ传递信息。在我们将服务器升级到拥有Rabbit集群的地方​​而不是单个盒子之前,所有情况都很好。如何将额外参数传递给Erlang客户端中的RabbitMQ连接

为了利用集群,您需要通过“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()}] 

如果只是[{二进制(),二进制()}]我可以看到与键/值的关系但不知道原子会在那里。我很清楚,我是Erlang的新手程序员,所以这可能是一个我不熟悉的常见构造,所以没有答案太明显。

回答

1

我发现这个在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). 

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

相关问题