ejabberd 模块间通信

ejabberd inter-module communication

我想知道一个模块是否可以获取其他模块的数据。我正在使用 ejabberd 服务器 15.10,我使用 Erlang 实现了模块。

情况如下:

每次ejabberd服务器在mod_filter[=23过滤消息时,是否可以从mod_calculate获取新数据=].

数据不存储在模块中,而是存储在变量中。如果没有该模块以某种方式将这些变量导出到外部世界,您将无法访问一个模块中代码运行的内部变量。

该模块可能已经导出了一些函数。检查:

rp(mod_calculate:module_info()).

这将显示模块中导出的所有函数。其中一些函数可能会将模块中的变量暴露给其他模块。如果没有,那么您需要添加此类函数并从 mod_filter.

调用它们

@Amiramix 所说的是准确的,但不是全部。

在 ejabberd 中有一个用于在模块之间传递事件的低耦合机制 - 这是 hooks and handlers 的概念。 link 指向 MongooseIM 文档,但这种机制在两个代码库中或多或少是相同的。

一般来说,一个模块可以调用一个hook,这类似于一个函数调用,但是取决于注册的handlers可能或可能不会导致执行某些操作。其他模块可以为他们选择的钩子注册处理程序。如果您正在编写有问题的模块,这是一种可能为您提供所需通信渠道的机制。

为了使事情更具体 - 每次 mod_filter 需要一些只有 mod_calculate 可以访问的信息时,它可以 运行 ejabberd_hooks:run_fold/4 使用自定义挂钩名称。如果 mod_calculate 为那个钩子注册了一个处理程序(通常在它的 start 函数中),它可以 return 一些与 mod_filter 相关的数据。但是,不同的模块可以为挂钩实现处理程序,因此 mod_filtermod_calculate 不会像使用直接函数调用(如 mod_calculate:some_function(...))时那样耦合。