【问题标题】:How to pass extra arguments to RabbitMQ connection in Erlang client如何在 Erlang 客户端中将额外的参数传递给 RabbitMQ 连接
【发布时间】:2012-06-19 18:24:01
【问题描述】:

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

为了利用集群,您需要将“x-ha-policy”参数与“all”或“nodes”值一起传递给 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 程序员,所以这可能是我不熟悉的常见结构,所以没有答案会太明显。

【问题讨论】:

    标签: erlang rabbitmq ejabberd


    【解决方案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 有可能适用于您的情况。

    【讨论】:

      猜你喜欢
      • 2015-11-17
      • 2018-04-08
      • 2019-03-16
      • 1970-01-01
      • 2015-12-05
      • 2019-09-18
      • 2018-10-07
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多