【问题标题】:Using rabbitmq-erlang-client from the Erlang shell?在 Erlang shell 中使用 rabbitmq-erlang-client?
【发布时间】:2014-02-10 02:30:19
【问题描述】:

我正在尝试使用 RabbitMQ Erlang 客户端绑定。我想从 Erlang shell 中执行此操作。

我可以成功加载相关模块,并且可以加载记录类型:

1> rr(amqp_connection).
['P_access','P_basic','P_channel'|...]
2> rl(amqp_params_network).
-record(amqp_params_network,{username = <<"guest">>,
                             password = <<"guest">>,
                             virtual_host = <<"/">>,

...等等。

但是当我尝试实际连接时:

{ok, C} = amqp_connection:start(#amqp_params_network{}).

...我收到错误消息...

** exception error: no function clause matching
    erl_eval:expr(amqp_auth_mechanisms,[],
    {eval,#Fun<shell.21.103280319>},
    {value,#Fun<shell.5.103280319>},
    none) (erl_eval.erl, line 200)

我唯一能想到的是amqp_params_network有一些函数作为默认记录值:

...
ssl_options = none,
auth_mechanisms =
[fun amqp_auth_mechanisms:plain/3,
 fun amqp_auth_mechanisms:amqplain/3],
client_properties = [],
...

我该如何克服这个问题,以便我可以在 Erlang shell 中使用这些东西?

【问题讨论】:

    标签: erlang rabbitmq


    【解决方案1】:

    外壳和记录并不总是能很好地混合。试试这个:

    1> rr(amqp_connection).
    ['P_access','P_basic','P_channel','P_confirm',
     'P_connection','P_dtx','P_exchange','P_file','P_queue',
     'P_stream','P_test','P_tunnel','P_tx','access.request',
     'access.request_ok',amqp_adapter_info,amqp_error,amqp_msg,
     amqp_params_direct,amqp_params_network,amqqueue,'basic.ack',
     'basic.cancel','basic.cancel_ok','basic.consume',
     'basic.consume_ok','basic.deliver','basic.get',
     'basic.get_empty'|...]
    2> P=#amqp_params_network{auth_mechanisms=[fun amqp_auth_mechanisms:plain/3, fun amqp_auth_mechanisms:amqplain/3]}.
    #amqp_params_network{username = <<"guest">>,
                         password = <<"guest">>,virtual_host = <<"/">>,
                         host = "localhost",port = undefined,channel_max = 0,
                         frame_max = 0,heartbeat = 0,connection_timeout = infinity,
                         ssl_options = none,
                         auth_mechanisms = [#Fun<amqp_auth_mechanisms.plain.3>,
                                            #Fun<amqp_auth_mechanisms.amqplain.3>],
                         client_properties = [],socket_options = []}
    3> amqp_connection:start(P).
    {ok,<0.42.0>}
    4>
    

    或者:

    1> rd(params, {username           = <<"guest">>,
    1>                               password           = <<"guest">>,
    1>                               virtual_host       = <<"/">>,
    1>                               host               = "localhost",
    1>                               port               = undefined,
    1>                               channel_max        = 0,
    1>                               frame_max          = 0,
    1>                               heartbeat          = 0,
    1>                               connection_timeout = infinity,
    1>                               ssl_options        = none,
    1>                               auth_mechanisms    =
    1>                                   [fun amqp_auth_mechanisms:plain/3,
    1>                                    fun amqp_auth_mechanisms:amqplain/3],
    1>                               client_properties  = [],
    1>                               socket_options     = []}).
    params
    2> P=#params{}.
    #params{username = <<"guest">>,password = <<"guest">>,
            virtual_host = <<"/">>,host = "localhost",port = undefined,
            channel_max = 0,frame_max = 0,heartbeat = 0,
            connection_timeout = infinity,ssl_options = none,
            auth_mechanisms = [#Fun<amqp_auth_mechanisms.plain.3>,
                               #Fun<amqp_auth_mechanisms.amqplain.3>],
            client_properties = [],socket_options = []}
    

    【讨论】:

    • 第一个变种我成功了。
    猜你喜欢
    • 2018-06-17
    • 2012-12-14
    • 2012-03-29
    • 2016-11-05
    • 2018-09-22
    • 1970-01-01
    • 2017-03-18
    • 2018-04-05
    • 2017-07-29
    相关资源
    最近更新 更多