1

最近我一直在从事 ejabberd 和内部模块开发。

我想使用 gen_mod + gen_server 行为开发一个内部模块。我的模块有一个基于此的 ejabberd 钩子:http: //metajack.im/2008/08/28/writing-ejabberd-modules-presence-storms

我的 start_link 函数是这样的:

start_link(Host, Opts) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
gen_server:start_link({local, Proc}, ?MODULE, [Host, Opts], []).

哪里 ?PROCNAME 是:

-define(PROCNAME, ejabberd_mod_mine)

所以在我的本地主机中它被注册为ejabberd_mod_mine_localhost

正如您在我链接的教程中看到的那样,他们使用挂钩来直接解析存在节,但是如果我想将该From值与我保存在 gen_server 状态中的值进行比较怎么办?我想过使用 gen_server cast 将数据包传递给它,但问题是函数挂钩在不同的进程中运行,因此我不能使用:

gen_server:cast(self(), {filter, Packet})

我可以使用:

gen_server:cast(ejabberd_mod_mine_localhost, {filter, Packet})

但是我应该硬编码进程的名称吗?如果主机名不同怎么办?我应该只使用模块名称注册我的 gen_server 吗?

4

1 回答 1

2

一种常见的模式是使用发送者或接收用户的域(取决于您要执行的操作)。例如 mod_offline(当目标用户离线时将数据包存储在 DB 上)使用目标 JID 来发现它必须在哪个域上运行,例如:

gen_mod:get_module_proc(To#jid.lserver, ?PROCNAME)
于 2013-03-04T18:12:25.987 回答