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