4

我正在尝试设置一个基于 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")

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

谢谢。

4

1 回答 1

2

您链接到的配置文档是指嵌入模式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 的任何东西。

于 2013-08-08T13:29:13.103 回答