我为eJabberd编写了一些扩展模块,其中大部分由于各种原因将信息片段传递给RabbitMQ。一切都很好,直到我们在登台中启动服务器,我们有一个Rabbit集群而不是一个盒子。
为了利用集群,您需要将“x-ha-policy”参数传递给Rabbit,其中包含“all”或“node”值。这适用于Java和Python生产者和消费者,但是eJabberd(当然使用Erlang AMQP客户端)让我有点困惑。x-ha-policy参数需要传递给“client_properties”参数,这只是额外参数的“包罗万象”。
在Python鼠兔我可以做:
client_params = {"x-ha-policy": "all"}
queue.declare(host, vhost, username, password, arguments=client_params)
这是可行的。然而,Erlang客户端的文档说参数应该作为列表传入:
[{binary(), atom(), binary()}]
如果它只是[{二进制(),二进制()}],我可以看到键/值的关系,但不确定原子会在那里。
为了清楚起见,我是一个Erlang程序员新手,所以这可能是一个我不熟悉的常见结构,所以没有答案会太明显。
我在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).
显然原子描述了值类型。我不知道可用的类型,但long str
有可能适用于您的情况。