我刚开始学习Erlang和RabbitMQ,并开始研究RabbitMQ的代码库。我发现在rabbit.erl中有start/2函数,但似乎需要调用start/0或boot/0函数来启动RabbitMQ。非常抱歉问题太基础,但非常感谢帮助理解RabbitMQ特别是启动和rabbit-boot-step过程的代码流程。
提前致谢。
提前致谢。
这里记录了RabbitMQ的启动过程:https://github.com/videlalvaro/rabbit-internals/blob/master/rabbit_boot_process.md
我很好奇你为什么想要了解它。
你正在查看的 RabbitMQ 文件 rabbit.erl
实现了 应用行为。这意味着当 Erlang VM 被告知启动 rabbit
应用程序时,它将查找一个 .app 文件(RabbitMQ 的文件在 ebin/rabbit_app.in
中)。在第 16 行,你可以看到 rabbit
是负责启动应用程序的模块。Erlang 假定该模块实现了应用程序行为(如果没有,你肯定会遇到错误)。一旦 Erlang 完成所有设置,它就会调用 rabbit.erl
中的 start/2
回调函数。这反过来又调用了 rabbit_sup:start_link/0
。我以前从未使用过 RabbitMQ,所以不确定之后会发生什么,但很可能监管者会启动所有其他监管者和工作进程,以使 RabbitMQ 正常运行。
至于 start/0
和 boot/0
,它们不是 Erlang 回调函数。它们是由 RabbitMQ 工程师创建的自定义函数。我想象这些函数用于在特定情况下启动应用程序(例如测试,在开发期间在解释器中引导应用程序等)。
希望这有帮助!在检查Erlang模块时,始终查找behaviour
模块属性(-behaviour(application)
)。一旦知道模块实现的行为,就可以查找该行为(erlang application behavior),并学习更多关于如何运作的知识。
-behaviour
:) - Stratus3Drun_boot_steps/1
在start/2
之后被调用,然后run_boot_steps/1
多次调用run_step/3
(大约在rabbit.erl的第366行)。我想那就是启动所有其他进程的地方。代码看起来有点难以理解。如果我回答了你最初的问题,请考虑将其标记为已接受。 - Stratus3D