221V 3 лет назад
Родитель
Сommit
08c0402f59
4 измененных файлов с 161 добавлено и 4 удалено
  1. 36 1
      README.md
  2. 93 0
      apps/myapp/src/myapp_events2.erl
  3. 9 1
      apps/myapp/src/myapp_sup.erl
  4. 23 2
      apps/myapp/src/test.erl

+ 36 - 1
README.md

@@ -52,6 +52,7 @@ Eshell V11.2.2.4  (abort with ^G)
 (myapp@127.0.0.1)1> test:test().
 ok
 (myapp@127.0.0.1)2> update: "12" 12
+update: "13" 13
 deleted: "9" 9
 deleted: "14" 14
 tick: "1" 1
@@ -62,11 +63,45 @@ tick: "2" 2
 tick: "4" 4
 tick: "11" 11
 tick: "6" 6
-tick: "13" 13
 tick: "8" 8
 tick: "15" 15
 tick: "10" 10
 tick: "12" 12
+tick: "13" 13
 
+(myapp@127.0.0.1)2> test:test2().
+add/update: "2" 2
+add/update: "4" 4
+ok
+add/update: "6" 6
+(myapp@127.0.0.1)3> add/update: "8" 8
+add/update: "10" 10
+add/update: "12" 12
+add/update: "14" 14
+add/update: "1" 1
+add/update: "3" 3
+add/update: "5" 5
+add/update: "7" 7
+add/update: "9" 9
+add/update: "11" 11
+add/update: "13" 13
+add/update: "15" 15
+add/update: "12" 12
+add/update: "13" 13
+deleted: "9" 9
+deleted: "14" 14
+tick: "1" 1
+tick: "3" 3
+tick: "5" 5
+tick: "2" 2
+tick: "7" 7
+tick: "4" 4
+tick: "11" 11
+tick: "6" 6
+tick: "8" 8
+tick: "10" 10
+tick: "15" 15
+tick: "12" 12
+tick: "13" 13
 ```
 

+ 93 - 0
apps/myapp/src/myapp_events2.erl

@@ -0,0 +1,93 @@
+-module(myapp_events2).
+-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) ->
+  ets:insert(events_table, V),
+  io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
+  {noreply, State};
+
+
+handle_cast({delete_task, {Task_Id, Proc_Id}=V}, State) ->
+  ets:delete(events_table, V),
+  io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
+  {noreply, State};
+
+
+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),
+  
+  %ets:fun2ms(fun({{A,B},C}) when C =< Timestamp_Now -> {{A,B},C} end).
+  %[{{{'$1','$2'},'$3'}, [{'=<','$3',{const,1642507256}}], [{{{{'$1','$2'}},'$3'}}]}]
+  
+  L = ets:select(events_table, [{{{'$1','$2'},'$3'}, [{'=<','$3',{const, Timestamp_Now}}], [{{{{'$1','$2'}},'$3'}}]}] ),
+  
+  lists:foldl(fun({{Task_Id0, Proc_Id0}=V, _Time0}, ok) ->
+     % send_to_rabbitmq({call_timer, Proc_Id0, Task_Id0}),
+     ets:delete(events_table, V),
+     io:format("tick: ~p ~p~n", [Task_Id0, Proc_Id0]),
+     ok
+    end, ok, L),
+  
+  erlang:send_after(1000, self(), check_time_process),
+  {noreply, State};
+
+
+handle_info(_Request, State) ->
+  {noreply, State}.
+
+
+terminate(_Reason, _State) ->
+  ok.
+
+code_change(_OldVsn, State, _Extra) -> 
+  {ok, State}.
+
+

+ 9 - 1
apps/myapp/src/myapp_sup.erl

@@ -8,12 +8,20 @@ start_link() ->
   supervisor:start_link({local, ?MODULE}, ?MODULE, []).
 
 init(_Args) ->
+  ets:new(events_table, [set, named_table, { keypos, 1 }, public]),
+  
   Procs = [
     #{id => worker_1,
       start => {myapp_events, start_link, []},
       restart => permanent,
       type => worker,
-      modules => [myapp_events] }],
+      modules => [myapp_events]},
+    
+    #{id => worker_2,
+      start => {myapp_events2, start_link, []},
+      restart => permanent,
+      type => worker,
+      modules => [myapp_events2]} ],
   
   {ok, { #{strategy => one_for_one, intensity => 10, period => 100}, Procs}}.
 

+ 23 - 2
apps/myapp/src/test.erl

@@ -1,6 +1,6 @@
 -module(test).
 
--export([test/0]).
+-export([test/0, test2/0]).
 
 test() ->
   Timestamp_Now = erlang:system_time(second),
@@ -12,7 +12,7 @@ test() ->
     timer:sleep(3000),
     
     myapp_events:add_task("12", 12, dynamic, 50),
-    myapp_events:add_task("12", 13, static, Timestamp_Now + 8000),
+    myapp_events:add_task("13", 13, static, Timestamp_Now + 80),
     
     myapp_events:delete_task("9", 9),
     myapp_events:delete_task("14", 14),
@@ -23,4 +23,25 @@ test() ->
   ok.
 
 
+test2() ->
+  Timestamp_Now = erlang:system_time(second),
+  L = lists:seq(1, 15),
+  [myapp_events2:add_task(integer_to_list(X), X, dynamic, X + 10) || X <- L, X rem 2 =:= 0],
+  [myapp_events2:add_task(integer_to_list(X), X, static, Timestamp_Now + X + 5) || X <- L, X rem 2 =:= 1],
+  
+  spawn(fun() ->
+    timer:sleep(3000),
+    
+    myapp_events2:add_task("12", 12, dynamic, 50),
+    myapp_events2:add_task("13", 13, static, Timestamp_Now + 80),
+    
+    myapp_events2:delete_task("9", 9),
+    myapp_events2:delete_task("14", 14),
+    
+    ok
+  end),
+  
+  ok.
+
+