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 キャストを使用することを考えましたが、問題は、関数フックが別のプロセスで実行されるため、使用できないことです。

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 に答える