gen_event

This commit is contained in:
Feng 2015-10-13 21:08:56 +08:00
parent ebf203a931
commit 05ff1ab002
1 changed files with 39 additions and 21 deletions

View File

@ -27,25 +27,35 @@
-module(emqttd_alarm). -module(emqttd_alarm).
-author("Feng Lee <feng@emqtt.io>").
-include("emqttd.hrl"). -include("emqttd.hrl").
-behaviour(gen_event).
-define(ALARM_MGR, ?MODULE).
%% API Function Exports
-export([start_link/0, alarm_fun/0, get_alarms/0, -export([start_link/0, alarm_fun/0, get_alarms/0,
set_alarm/1, clear_alarm/1, set_alarm/1, clear_alarm/1,
add_alarm_handler/1, add_alarm_handler/2, add_alarm_handler/1, add_alarm_handler/2,
delete_alarm_handler/1]). delete_alarm_handler/1]).
%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2, handle_info/2, -export([init/1, handle_event/2, handle_call/2, handle_info/2,
terminate/2]). terminate/2, code_change/3]).
-define(SERVER, ?MODULE). %%%=============================================================================
%%% API
%%%=============================================================================
start_link() -> start_link() ->
case gen_event:start_link({local, ?SERVER}) of start_with(fun(Pid) -> gen_event:add_handler(Pid, ?MODULE, []) end).
{ok, Pid} ->
gen_event:add_handler(?SERVER, ?MODULE, []), start_with(Fun) ->
{ok, Pid}; case gen_event:start_link({local, ?ALARM_MGR}) of
Error -> {ok, Pid} -> Fun(Pid), {ok, Pid};
Error Error -> Error
end. end.
alarm_fun() -> alarm_fun() ->
@ -60,27 +70,29 @@ alarm_fun(Bool) ->
-spec set_alarm(mqtt_alarm()) -> ok. -spec set_alarm(mqtt_alarm()) -> ok.
set_alarm(Alarm) when is_record(Alarm, mqtt_alarm) -> set_alarm(Alarm) when is_record(Alarm, mqtt_alarm) ->
gen_event:notify(?SERVER, {set_alarm, Alarm}). gen_event:notify(?ALARM_MGR, {set_alarm, Alarm}).
-spec clear_alarm(any()) -> ok. -spec clear_alarm(any()) -> ok.
clear_alarm(AlarmId) when is_binary(AlarmId) -> clear_alarm(AlarmId) when is_binary(AlarmId) ->
gen_event:notify(?SERVER, {clear_alarm, AlarmId}). gen_event:notify(?ALARM_MGR, {clear_alarm, AlarmId}).
-spec get_alarms() -> list(mqtt_alarm()).
get_alarms() -> get_alarms() ->
gen_event:call(?SERVER, ?MODULE, get_alarms). gen_event:call(?ALARM_MGR, ?MODULE, get_alarms).
add_alarm_handler(Module) when is_atom(Module) -> add_alarm_handler(Module) when is_atom(Module) ->
gen_event:add_handler(?SERVER, Module, []). gen_event:add_handler(?ALARM_MGR, Module, []).
add_alarm_handler(Module, Args) when is_atom(Module) -> add_alarm_handler(Module, Args) when is_atom(Module) ->
gen_event:add_handler(?SERVER, Module, Args). gen_event:add_handler(?ALARM_MGR, Module, Args).
delete_alarm_handler(Module) when is_atom(Module) -> delete_alarm_handler(Module) when is_atom(Module) ->
gen_event:delete_handler(?SERVER, Module, []). gen_event:delete_handler(?ALARM_MGR, Module, []).
%%%=============================================================================
%%% Default Alarm handler
%%%=============================================================================
%%-----------------------------------------------------------------
%% Default Alarm handler
%%-----------------------------------------------------------------
init(_) -> init(_) ->
{ok, []}. {ok, []}.
@ -120,6 +132,13 @@ terminate(swap, Alarms) ->
terminate(_, _) -> terminate(_, _) ->
ok. ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%=============================================================================
%%% Internal functions
%%%=============================================================================
alarm_msg(Type, AlarmId, Json) -> alarm_msg(Type, AlarmId, Json) ->
Msg = emqttd_message:make(alarm, Msg = emqttd_message:make(alarm,
topic(Type, AlarmId), topic(Type, AlarmId),
@ -132,4 +151,3 @@ topic(alert, AlarmId) ->
topic(clear, AlarmId) -> topic(clear, AlarmId) ->
emqttd_topic:systop(<<"alarms/", AlarmId/binary, "/clear">>). emqttd_topic:systop(<<"alarms/", AlarmId/binary, "/clear">>).