最近我一直在从事 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 吗?