ejabberd模块间通信

时间:2016-02-13 13:43:59

标签: erlang ejabberd ejabberd-module

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

情况如下:

  • 我有一个过滤消息的模块: mod_filter
  • 我有另一个模块在服务器运行时进行一些计算: mod_calculate

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

2 个答案:

答案 0 :(得分:0)

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

模块可能已经导出了一些功能。检查:

rp(mod_calculate:module_info()).

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

答案 1 :(得分:0)

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

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

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

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