如何为RabbitMQ / Erlang使用多个配置文件

时间:2013-08-08 13:02:06

标签: erlang rabbitmq rabbitmq-shovel

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

我的问题是我要求某些配置需要静态,而某些配置需要动态,具体来说,我需要能够重新配置因用户交互而不时在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")

任何形式的解决方案或帮助都将受到赞赏,

感谢。

1 个答案:

答案 0 :(得分:2)

您要关联的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 '<<"guest">>' -rabbit default_pass '<<"guest">>'

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