【问题标题】:how to use multiple configuration files for RabbitMQ / Erlang如何为 RabbitMQ / Erlang 使用多个配置文件
【发布时间】:2013-08-10 05:02:05
【问题描述】:

我正在尝试设置一个基于 Spring 的 Java 应用程序,该应用程序使用本地安装的 RabbitMQ 服务器在节点之间传递消息。如您所知,rabbitmq.config 文件可用于配置各种参数,并由运行 Rabbit 服务器的底层 Erlang 节点加载。

我的问题是我有一个要求,有些配置需要静态,有些需要动态,具体来说,我需要能够重新配置由于用户交互,有时在 Rabbit 服务器上运行的铲子(即我需要以编程方式修改配置文件并重新启动 rabbit 服务器以使其生效),但是,我 每次都想重写静态配置(特别是不想让java代码读取)。

我想我通过阅读 Erlang 配置文件手册 (http://www.erlang.org/doc/man/config.html) 找到了解决方案,该手册解释了如何使用一个指向另一个配置文件的配置文件,以便 Erlang 合并两个文件的配置。不幸的是,它似乎根本不起作用,我在网上找不到有关此问题的任何参考。

我正在使用 RabbitMQ 3.1.3 和 Erlang 5.10/OTP R16 在 Windows 7 x64 操作系统上对此进行测试。

第一个配置文件:

[
{'rabbit', [
    {'tcp_listeners', [
        5672
    ]},
    {'default_vhost', <<"/">>}
]}, "C:\\Users\\itay\\Desktop\\RabbitMQ\\rabbitmq2.config"
].

第二个配置文件:

[
{'rabbit', [
    {'default_user', <<"guest">>},
    {'default_pass', <<"guest">>}
]}
].

我也尝试使用单个反斜杠或位串作为路径,但这似乎并不重要。

在cmd中运行服务器的输出是:

{"could not start kernel pid",application_controller,"invalid config data: invalid application     name:  \"C:\\Users\\itay\\Desktop\\RabbitMQ\\rabbitmq2.config\""}

Crash dump was written to: erl_crash.dump
could not start kernel pid (application_controller) (invalid config data: invalid application name:  "C:\\Users\\itay\\Desktop\\RabbitMQ\\rabbitmq2.config")

我们将不胜感激任何类型的解决方案或帮助,

谢谢。

【问题讨论】:

    标签: erlang rabbitmq rabbitmq-shovel


    【解决方案1】:

    您链接到的config documentation 指的是嵌入模式 中的sys.config 文件。

    嵌入式模式下启动Erlang时,假设只使用了一个系统配置文件,名为sys.config。这个文件应该位于$ROOT/releases/Vsn,其中$ROOT是Erlang/OTP根安装目录,Vsn是发布版本。

    我怀疑您是否在嵌入式模式下运行 RabbitMQ,并且从问题来看,您没有编辑 sys.config 文件。您可能正在编辑 RabbitMQ 的默认配置文件并使用默认脚本来启动服务器(因此以 交互模式 运行 erlang。

    相反,您真正想要的是将特定配置值传递给应用程序。解决方案在您链接的同一页面上,上面:

    配置文件包含系统中应用程序的配置参数值。 erl命令行参数-config Name告诉系统使用系统配置文件Name.config中的数据。

    配置文件中的配置参数值将覆盖应用程序资源文件中的值(参见 app(4))。配置文件中的值可以被命令行标志覆盖(参见 erl(1))。

    所以你可以简单地在命令行中传递给 erl:

    • 一个额外的-config参数指向第二个文件

      -config second_file

    • 具有-App Par Val 语法的值(Par 和 Val 都被解释为术语,添加引号)

      -rabbit default_user '&lt;&lt;"guest"&gt;&gt;' -rabbit default_pass '&lt;&lt;"guest"&gt;&gt;'

    我猜你必须使用RABBITMQ_SERVER_START_ARGS 环境变量,或者编辑rabbitmq-server.bat 脚本或者你的Java 代码用来启动RabbitMQ 的任何东西。

    【讨论】:

    • 好的,据我所知,当 Erlang 在 embedded 模式下运行时,它总是寻找 sys.config 并忽略 -config 选项。因此,可以让 sys.config 文件指向另一个将与之合并的文件。在 interactive 模式下,使用-config 选项,不支持合并。这是正确的描述吗?
    • 我试图用第二个配置文件添加另一个 -config 标志,但节点不会启动 - 我得到这个输出:Conflicting -start_erl and -config options 似乎只支持一个配置文件......这个对我不利,因为仅使用 -App Par Val 参数配置铲子是不切实际的。
    • start_erl 是一个特定于 Windows 的工具,用于在 embedded 模式下启动 Erlang。错误消息暗示您在命令行中传递 -config 和第二个配置文件,其中根本没有 -config 选项,即可能不在正确的位置。你修改了脚本还是使用了RABBITMQ_SERVER_START_ARGS
    • 我使用了 start args 变量。我还可以看到rabbit使用-config在命令行中设置默认的rabbitmq.config文件。但是,您的其他建议可能对我有用,因为可以使用 -args_file 选项并从包含单个 -rabbit 'shovels' &lt;my shovels term&gt; 参数的单独文件中加载铲子。我什至可以使用反斜杠字符添加换行符,以使这个长表达式易于阅读。
    猜你喜欢
    • 2018-06-17
    • 2014-06-05
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多