gen_イベント解説
3586 ワード
OTPではイベントマネージャ(event manager)がイベントを受信するために使用され、ここでのイベントは非常に広く、エラーのために様々なerlangが許可する情報を警告することができる.
イベントマネージャには、0つ以上のイベントプロセッサ(event handler)があります.イベントマネージャがイベントを受信すると、このイベントはマネージャ内にインストールされているすべてのプロセッサで処理されます.
実はイベントマネージャ(gen_event behaviour)には、インストールされたプロセッサ(Moduleモジュール)と対応する状態を保存する[{Module,State}]があります.イベントを受信すると、マネージャはModuleの
Module:handle_event/2関数で処理します.
callbacksインタフェース
1. init(InitArg)
プロセッサのインストール後、初期化を行い、Module対応の状態に戻る
2. handle_event(Event, State)
各種イベントの処理
3. handle_call(Request, State)
同期呼び出しの処理
4. terminate(Arg, State)
プロセッサが削除された場合、またはイベントマネージャが停止した場合、Moduleはterminateを呼び出します.
詳細はerlang manマニュアルを参照してください
Excample-ログ記録モジュール、最近の5つのエラーログを保存
gen_イベント使用
1.gen_を起動event
gen_event:start_link({local,?NAME})は名前を付けて起動しますか?NAMEが表すマクロのイベントマネージャ.
同gen_serverと同様に、名前は{global,?NAME}またはPidインタラクションを使用しないことができます.このモジュールをsupervision treeのworkerとして使用する場合はstart_を使用する必要があります.link起動、
別のアプリケーションではstartを使用できます
2.handlerを追加
gen_event:add_handler(?NAME,?MODULE,[])このModuleをhandlerとしてイベントマネージャに追加すると、関数内部でModule:init/1関数が呼び出されます.パラメータは
add_handler/3の3番目のパラメータ.
3.イベントの通知
イベントマネージャにログを記録したい場合はgen_enevt:notify(?NAME, {log, E}).イベントマネージャにイベントを送信すると、イベント管理が内部を順次呼び出す
インストールされたすべてのプロセッサがこのイベントを処理し、対応するプロセッサのステータスを更新します.具体的な処理過程はModuleのhandle_にありますevent/2で行います.ここでは{ok,trim([E|List])}ログメッセージを保存します.
4.イベントを削除
gen_event:delete_handler(?NAME,?MODULE,[])私たちは?MODULEで指定したプロセッサは削除され、Module:terminate/2が呼び出されてクリアされます.
5.同期呼び出し
gen_server:call(?NAME,?MODULE,report)は同期呼び出しに使用されます.この関数はgen_とは異なります.Enevt:notify/2は、3つのパラメータを有し、2番目のパラメータは、そのイベントプロセッサを呼び出してこの要求を処理することを示すために使用され、notifyはすべてのイベントプロセッサにイベントを通知するため、ここでは異なる.
関数呼び出しModule:handle_call/2は結果を返し、ここでは保存したlog Listを直接返します
6.イベントマネージャの停止
イベントマネージャがsupervision treeに適用され、stop関数を指定する必要がない場合、モニタツリーはイベントマネージャを自動的に消去します.個別のアプリケーションの場合はgen_を呼び出す必要があります.Envent:stop(?NAME)イベントマネージャを停止します.
ここでgen_serverは似ています.詳細はsupervision shutdown strategyを参照してください.
上記の説明でgen_Enevtはおなじみですか?exampleコードを自分で書いてみると、もっと深く理解できます!
イベントマネージャには、0つ以上のイベントプロセッサ(event handler)があります.イベントマネージャがイベントを受信すると、このイベントはマネージャ内にインストールされているすべてのプロセッサで処理されます.
実はイベントマネージャ(gen_event behaviour)には、インストールされたプロセッサ(Moduleモジュール)と対応する状態を保存する[{Module,State}]があります.イベントを受信すると、マネージャはModuleの
Module:handle_event/2関数で処理します.
callbacksインタフェース
1. init(InitArg)
プロセッサのインストール後、初期化を行い、Module対応の状態に戻る
2. handle_event(Event, State)
各種イベントの処理
3. handle_call(Request, State)
同期呼び出しの処理
4. terminate(Arg, State)
プロセッサが削除された場合、またはイベントマネージャが停止した場合、Moduleはterminateを呼び出します.
詳細はerlang manマニュアルを参照してください
Excample-ログ記録モジュール、最近の5つのエラーログを保存
-module(recent_logger).
-behaviour(gen_enevt).
-export([start/0, stop/0, log/1, report/0, release/0])
%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2, terminate/2]).
-define(NAME, logger_manager).
%% start behaviour
start() ->
case gen_event:start_link({local, ?NAME}) of
Ret = {ok, _Pid} ->
gen_event:add_handler(?NAME, ?MODULE, []),
Ret;
Other ->
Other
end.
%% stop
stop() ->
gen_envent:stop(?NAME).
%% notify an envent about log
log(E) ->
gen_enevt:notify(?NAME, {log, E}).
%% report the all log
report() ->
gen_event:call(?NAME, ?MODULE, report).
%% release this handler
release() ->
gen_event:delete_handler(?NAME, ?MODULE, release).
init(_Arg) ->
io:format("start recent log handler~n"),
{ok, []}.
handle_event({log, E}, List) ->
{ok, trim([E | List])}.
handle_call(report, List) ->
List.
terminate(stop, _List) ->
io:format("recent log handler stop~n"),
ok;
terminate(release, _List) ->
io:format("recent log handler release~n"),
ok.
%% save the recent five log
trim([E1, E2, E3, E4, E5 | []) ->
[E1, E2, E3, E4, E5];
trim(List) ->
List.
gen_イベント使用
1.gen_を起動event
gen_event:start_link({local,?NAME})は名前を付けて起動しますか?NAMEが表すマクロのイベントマネージャ.
同gen_serverと同様に、名前は{global,?NAME}またはPidインタラクションを使用しないことができます.このモジュールをsupervision treeのworkerとして使用する場合はstart_を使用する必要があります.link起動、
別のアプリケーションではstartを使用できます
2.handlerを追加
gen_event:add_handler(?NAME,?MODULE,[])このModuleをhandlerとしてイベントマネージャに追加すると、関数内部でModule:init/1関数が呼び出されます.パラメータは
add_handler/3の3番目のパラメータ.
3.イベントの通知
イベントマネージャにログを記録したい場合はgen_enevt:notify(?NAME, {log, E}).イベントマネージャにイベントを送信すると、イベント管理が内部を順次呼び出す
インストールされたすべてのプロセッサがこのイベントを処理し、対応するプロセッサのステータスを更新します.具体的な処理過程はModuleのhandle_にありますevent/2で行います.ここでは{ok,trim([E|List])}ログメッセージを保存します.
4.イベントを削除
gen_event:delete_handler(?NAME,?MODULE,[])私たちは?MODULEで指定したプロセッサは削除され、Module:terminate/2が呼び出されてクリアされます.
5.同期呼び出し
gen_server:call(?NAME,?MODULE,report)は同期呼び出しに使用されます.この関数はgen_とは異なります.Enevt:notify/2は、3つのパラメータを有し、2番目のパラメータは、そのイベントプロセッサを呼び出してこの要求を処理することを示すために使用され、notifyはすべてのイベントプロセッサにイベントを通知するため、ここでは異なる.
関数呼び出しModule:handle_call/2は結果を返し、ここでは保存したlog Listを直接返します
6.イベントマネージャの停止
イベントマネージャがsupervision treeに適用され、stop関数を指定する必要がない場合、モニタツリーはイベントマネージャを自動的に消去します.個別のアプリケーションの場合はgen_を呼び出す必要があります.Envent:stop(?NAME)イベントマネージャを停止します.
ここでgen_serverは似ています.詳細はsupervision shutdown strategyを参照してください.
上記の説明でgen_Enevtはおなじみですか?exampleコードを自分で書いてみると、もっと深く理解できます!