我想知道是否可以从模块中获取其他模块的数据。我使用的是ejabberd服务器15.10,我使用Erlang实现了模块。
情况如下:
每次ejabberd服务器在 mod_filter 过滤消息时,是否可以从 mod_calculate 获取新数据。
答案 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_calculate
和mod_calculate:some_function(...)
不会耦合。{ p>