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).
-author("Feng Lee <feng@emqtt.io>").
-include("emqttd.hrl").
-behaviour(gen_event).
-define(ALARM_MGR, ?MODULE).
%% API Function Exports
-export([start_link/0, alarm_fun/0, get_alarms/0,
set_alarm/1, clear_alarm/1,
add_alarm_handler/1, add_alarm_handler/2,
delete_alarm_handler/1]).
%% gen_event callbacks
-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() ->
case gen_event:start_link({local, ?SERVER}) of
{ok, Pid} ->
gen_event:add_handler(?SERVER, ?MODULE, []),
{ok, Pid};
Error ->
Error
start_with(fun(Pid) -> gen_event:add_handler(Pid, ?MODULE, []) end).
start_with(Fun) ->
case gen_event:start_link({local, ?ALARM_MGR}) of
{ok, Pid} -> Fun(Pid), {ok, Pid};
Error -> Error
end.
alarm_fun() ->
@ -60,34 +70,36 @@ alarm_fun(Bool) ->
-spec set_alarm(mqtt_alarm()) -> ok.
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.
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() ->
gen_event:call(?SERVER, ?MODULE, get_alarms).
gen_event:call(?ALARM_MGR, ?MODULE, get_alarms).
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) ->
gen_event:add_handler(?SERVER, Module, Args).
gen_event:add_handler(?ALARM_MGR, Module, Args).
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(_) ->
{ok, []}.
handle_event({set_alarm, Alarm = #mqtt_alarm{id = AlarmId,
handle_event({set_alarm, Alarm = #mqtt_alarm{id = AlarmId,
severity = Severity,
title = Title,
summary = Summary}}, Alarms)->
title = Title,
summary = Summary}}, Alarms)->
Timestamp = os:timestamp(),
Json = mochijson2:encode([{id, AlarmId},
{severity, Severity},
@ -120,6 +132,13 @@ terminate(swap, Alarms) ->
terminate(_, _) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%=============================================================================
%%% Internal functions
%%%=============================================================================
alarm_msg(Type, AlarmId, Json) ->
Msg = emqttd_message:make(alarm,
topic(Type, AlarmId),
@ -132,4 +151,3 @@ topic(alert, AlarmId) ->
topic(clear, AlarmId) ->
emqttd_topic:systop(<<"alarms/", AlarmId/binary, "/clear">>).