|
@@ -0,0 +1,99 @@
|
|
|
+-module(myapp_events).
|
|
|
+-behaviour(gen_server).
|
|
|
+
|
|
|
+-export([start_link/0]).
|
|
|
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
|
|
|
+
|
|
|
+-export([add_task/4, delete_task/2]).
|
|
|
+
|
|
|
+
|
|
|
+-define(IS_STRING(S), (is_list(S) andalso S /= [] andalso is_integer(hd(S)))).
|
|
|
+
|
|
|
+
|
|
|
+add_task(Task_Id, Proc_Id, Type, Time)
|
|
|
+when ?IS_STRING(Task_Id), is_integer(Proc_Id), ((Type =:= static) orelse (Type =:= dynamic)), is_integer(Time) ->
|
|
|
+ Time2 = case Type of
|
|
|
+ dynamic ->
|
|
|
+ erlang:system_time(second) + Time; % Timestamp_Now + Time
|
|
|
+ _ ->
|
|
|
+ % static
|
|
|
+ Time
|
|
|
+ end,
|
|
|
+ gen_server:cast(?MODULE, {add_task, {Task_Id, Proc_Id, Time2}}),
|
|
|
+ ok.
|
|
|
+
|
|
|
+delete_task(Task_Id, Proc_Id)
|
|
|
+when ?IS_STRING(Task_Id), is_integer(Proc_Id) ->
|
|
|
+ gen_server:cast(?MODULE, {delete_task, {Task_Id, Proc_Id}}),
|
|
|
+ ok.
|
|
|
+
|
|
|
+
|
|
|
+start_link() ->
|
|
|
+ gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
|
|
+
|
|
|
+
|
|
|
+init([]) ->
|
|
|
+ erlang:send_after(100, self(), check_time_process),
|
|
|
+ State = [],
|
|
|
+ {ok, State}.
|
|
|
+
|
|
|
+
|
|
|
+handle_call(_Req, _From, State) ->
|
|
|
+ {reply, not_handled, State}.
|
|
|
+
|
|
|
+
|
|
|
+handle_cast({add_task, {Task_Id, Proc_Id, _Time}=V}, State) ->
|
|
|
+ State2 = lists:filter(fun({Task_Id0, Proc_Id0, _Time0}) ->
|
|
|
+ if Task_Id =:= Task_Id0 andalso Proc_Id =:= Proc_Id0 ->
|
|
|
+ io:format("update: ~p ~p~n", [Task_Id0, Proc_Id0]),
|
|
|
+ false;
|
|
|
+ true -> true
|
|
|
+ end
|
|
|
+ end, State),
|
|
|
+ {noreply, [V|State2]};
|
|
|
+
|
|
|
+
|
|
|
+handle_cast({delete_task, {Task_Id, Proc_Id}}, State) ->
|
|
|
+ State2 = lists:filter(fun({Task_Id0, Proc_Id0, _Time}) ->
|
|
|
+ if Task_Id =:= Task_Id0 andalso Proc_Id =:= Proc_Id0 ->
|
|
|
+ io:format("deleted: ~p ~p~n", [Task_Id0, Proc_Id0]),
|
|
|
+ false;
|
|
|
+ true -> true
|
|
|
+ end
|
|
|
+ end, State),
|
|
|
+ {noreply, State2};
|
|
|
+
|
|
|
+
|
|
|
+handle_cast(_Req, State) ->
|
|
|
+ {noreply, State}.
|
|
|
+
|
|
|
+
|
|
|
+handle_info(check_time_process, []) ->
|
|
|
+ erlang:send_after(1000, self(), check_time_process),
|
|
|
+ {noreply, []};
|
|
|
+handle_info(check_time_process, State) ->
|
|
|
+ Timestamp_Now = erlang:system_time(second),
|
|
|
+ State2 = lists:filtermap(fun({Task_Id0, Proc_Id0, Time0}=V) ->
|
|
|
+ if Time0 =< Timestamp_Now ->
|
|
|
+ % send_to_rabbitmq({call_timer, Proc_Id0, Task_Id0}),
|
|
|
+ io:format("tick: ~p ~p~n", [Task_Id0, Proc_Id0]),
|
|
|
+ false;
|
|
|
+ true -> {true, V}
|
|
|
+ end
|
|
|
+ end, State),
|
|
|
+
|
|
|
+ erlang:send_after(1000, self(), check_time_process),
|
|
|
+ {noreply, State2};
|
|
|
+
|
|
|
+
|
|
|
+handle_info(_Request, State) ->
|
|
|
+ {noreply, State}.
|
|
|
+
|
|
|
+
|
|
|
+terminate(_Reason, _State) ->
|
|
|
+ ok.
|
|
|
+
|
|
|
+code_change(_OldVsn, State, _Extra) ->
|
|
|
+ {ok, State}.
|
|
|
+
|
|
|
+
|