RabbitMQ源代码 - rabbitmq-boot-steps如何工作?

3
我刚开始学习Erlang和RabbitMQ,并开始研究RabbitMQ的代码库。我发现在rabbit.erl中有start/2函数,但似乎需要调用start/0或boot/0函数来启动RabbitMQ。非常抱歉问题太基础,但非常感谢帮助理解RabbitMQ特别是启动和rabbit-boot-step过程的代码流程。
提前致谢。

你能提供一下你正在查看的源代码的URL吗?我觉得我理解你的问题,但是一些代码会帮助我更加明确。 - Stratus3D
2个回答

1

0

你正在查看的 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/0boot/0,它们不是 Erlang 回调函数。它们是由 RabbitMQ 工程师创建的自定义函数。我想象这些函数用于在特定情况下启动应用程序(例如测试,在开发期间在解释器中引导应用程序等)。

希望这有帮助!在检查Erlang模块时,始终查找behaviour模块属性(-behaviour(application))。一旦知道模块实现的行为,就可以查找该行为(erlang application behavior),并学习更多关于如何运作的知识。


哦,对了...Erlang在单词behavior上使用英式拼写。因此,在定义模块行为时,始终要写成-behaviour :) - Stratus3D
谢谢。我肯定错过了什么,因为我确实查看了rabbit_sup.erl文件以及其中实现的start_link/2和init/1函数,但并不清楚所有其他进程是如何启动的。在rabbit_sup中,init/1函数看起来像是init([]) -> {ok, {{one_for_all, 0, 1}, []}}. - 在此调用中未提及任何子规范。 - tintin
是的,那个不做任何事情。run_boot_steps/1start/2之后被调用,然后run_boot_steps/1多次调用run_step/3(大约在rabbit.erl的第366行)。我想那就是启动所有其他进程的地方。代码看起来有点难以理解。如果我回答了你最初的问题,请考虑将其标记为已接受。 - Stratus3D
@Stratus3D RabbitMQ不像标准的OTP应用程序那样启动,因此许多事情在这里不适用。无论如何,请参阅我的答案或此链接https://github.com/videlalvaro/rabbit-internals/blob/master/rabbit_boot_process.md - old_sound
@Stratus3D,start和boot函数实际上用于启动RabbitMQ,它们与测试或任何这些场景无关。 - old_sound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接