我想知道是否可以从一个模块中获取其他模块的数据。我正在使用 ejabberd server 15.10,我使用 Erlang 实现了模块。
情况如下:
- 我有一个过滤消息的模块:mod_filter
- 我有另一个模块在服务器运行时进行一些计算:mod_calculate
每次 ejabberd 服务器在 mod_filter 过滤消息时,是否可以从mod_calculate获取新数据。
我想知道是否可以从一个模块中获取其他模块的数据。我正在使用 ejabberd server 15.10,我使用 Erlang 实现了模块。
情况如下:
每次 ejabberd 服务器在 mod_filter 过滤消息时,是否可以从mod_calculate获取新数据。
数据不存储在模块中,而是存储在变量中。如果没有该模块以某种方式将这些变量导出到外部世界,您将无法访问一个模块中的代码运行的内部变量。
该模块可能已经导出了一些功能。检查:
rp(mod_calculate:module_info()).
这将显示模块中导出的所有函数。其中一些函数可能会将模块中的变量暴露给其他模块。如果没有,那么您将需要添加此类函数并从mod_filter
.
@Amiramix 所说的内容是准确的,但不是全部。
在 ejabberd 中,有一种低耦合机制可以在模块之间进行事件通信——它是钩子和处理程序的概念。MongooseIM 文档中的链接点,但这种机制在两个代码库中或多或少是相同的。
一般来说,一个模块可以调用一个钩子,这类似于函数调用,但取决于注册的处理程序可能会或可能不会导致某些操作被执行。其他模块可以为他们选择的钩子注册处理程序。如果您正在编写有问题的模块,这是一种可能为您提供所需通信渠道的机制。
为了使事情更具体 - 每次mod_filter
需要一些只能mod_calculate
访问的信息,它可以ejabberd_hooks:run_fold/4
使用自定义挂钩名称运行。如果mod_calculate
为该钩子注册一个处理程序(通常在其start
函数中),它可以返回一些与mod_filter
. 但是,不同的模块可以为钩子实现一个处理程序,因此mod_filter
不会mod_calculate
像使用直接函数调用(如mod_calculate:some_function(...)
)时那样耦合。