2012-06-17 78 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適用於您的情況。

相關問題