我正在写一个ejabberd模块来过滤数据包。我需要得到主机名来使用gen_mod:get_module_opt()
拉一些配置。
我有4个重要职能:
start(Host, _Opt)
:这是一个ejabberd函数,用于加载我的模块。filter_packet({From, To, XML})
:这是我的包过滤器钩子。我不能将自定义参数传递给这个函数,因为它是ejabberd中的钩子。get_translation(XmlData)
:filter_packet()
在循环中调用get_translation()
fetch_translation(XmlData)
:从get_translation()
递归调用。这是我调用gen_mod:get_module_opt()
的地方,因此需要Host
。
我的问题是,如何从start()
中取出Host
并将其放入全局变量中,以便fetch_translation
可以访问它?
8条答案
按热度按时间svgewumm1#
“最简单的方法”是创建一个命名的ets表,并把它放在那里。
请注意,这是一个“通用”的解决方案。Ejabberd可能会提供您想要的设施,但我无法帮助您。
jecbmhm32#
这听起来可能有点夸张,但你可以考虑实现一个非常基本的gen_server。它包含一个回调可用的状态,数据可以保存在那里。对于你的情况,你可以编写一个类似于下面的模块:
y0u0uwnf3#
您可以在模块顶部定义全局变量...如下所示
例如
您可以在模块中所有方法中使用这个全局变量。
wfauudbj4#
您可以启动一个新的消息筛选进程,并使用
erlang:register/2
注册它,然后通过它路由所有filter_packet/1
请求(这是一个潜在的瓶颈)。5tmbdcev5#
假设您正在过滤传入的数据包,则To#jid.lserver可能是您的主机。
oyjwcjzk6#
而不是在单域ejabberd部署(没有虚拟主机)中,
可以使用?MYNAME宏获取本地XMPP域(有关定义,请参阅ejabberd.hrl)。
hsgswve47#
尝试使用persistent_term:
um6iljoc8#
您不能创建全局变量,但可以在函数外定义一条记录,并创建该记录的一个示例(带有属性),然后将其传递给您调用的方法。因此,您只能通过方法参数共享一条记录。