myapp_events2.erl 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. -module(myapp_events2).
  2. -behaviour(gen_server).
  3. -export([start_link/0]).
  4. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  5. -export([add_task/4, delete_task/2]).
  6. -export([add_task_b/4, delete_task_b/2]).
  7. -export([check_ets_count/0]).
  8. -define(IS_STRING(S), (is_list(S) andalso S /= [] andalso is_integer(hd(S)))).
  9. add_task(Task_Id, Proc_Id, Type, Time)
  10. when ?IS_STRING(Task_Id), is_integer(Proc_Id), ((Type =:= static) orelse (Type =:= dynamic)), is_integer(Time) ->
  11. Time2 = case Type of
  12. dynamic ->
  13. erlang:system_time(second) + Time; % Timestamp_Now + Time
  14. _ ->
  15. % static
  16. Time
  17. end,
  18. gen_server:cast(?MODULE, {add_task, {{Task_Id, Proc_Id}, Time2}}),
  19. ok.
  20. delete_task(Task_Id, Proc_Id)
  21. when ?IS_STRING(Task_Id), is_integer(Proc_Id) ->
  22. gen_server:cast(?MODULE, {delete_task, {Task_Id, Proc_Id}}),
  23. ok.
  24. add_task_b(Task_Id, Proc_Id, Type, Time)
  25. when ?IS_STRING(Task_Id), is_integer(Proc_Id), ((Type =:= static) orelse (Type =:= dynamic)), is_integer(Time) ->
  26. Time2 = case Type of
  27. dynamic ->
  28. erlang:system_time(second) + Time; % Timestamp_Now + Time
  29. _ ->
  30. % static
  31. Time
  32. end,
  33. gen_server:call(?MODULE, {add_task, {{Task_Id, Proc_Id}, Time2}}).
  34. delete_task_b(Task_Id, Proc_Id)
  35. when ?IS_STRING(Task_Id), is_integer(Proc_Id) ->
  36. gen_server:call(?MODULE, {delete_task, {Task_Id, Proc_Id}}).
  37. start_link() ->
  38. gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
  39. init([]) ->
  40. ets:new(events_table, [ordered_set, named_table, { keypos, 1 }, private]),
  41. %erlang:send_after(100, self(), check_time_process),
  42. self() ! check_time_process,
  43. State = [],
  44. {ok, State}.
  45. handle_call({add_task, {{_Task_Id, _Proc_Id}, _Time}=V}, _From, State) ->
  46. true = ets:insert(events_table, V),
  47. %io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
  48. {reply, ok, State};
  49. handle_call({delete_task, {_Task_Id, _Proc_Id}=V}, _From, State) ->
  50. true = ets:delete(events_table, V),
  51. %io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
  52. {reply, ok, State};
  53. handle_call(_Req, _From, State) ->
  54. {reply, not_handled, State}.
  55. handle_cast({add_task, {{_Task_Id, _Proc_Id}, _Time}=V}, State) ->
  56. ets:insert(events_table, V),
  57. %io:format("add/update: ~p ~p~n", [Task_Id, Proc_Id]),
  58. {noreply, State};
  59. handle_cast({delete_task, {_Task_Id, _Proc_Id}=V}, State) ->
  60. ets:delete(events_table, V),
  61. %io:format("deleted: ~p ~p~n", [Task_Id, Proc_Id]),
  62. {noreply, State};
  63. handle_cast(_Req, State) ->
  64. {noreply, State}.
  65. handle_info(check_time_process, State) ->
  66. erlang:send_after(1000, self(), check_time_process),
  67. Timestamp_Now = erlang:system_time(second),
  68. %ets:fun2ms(fun({{A,B},C}) when C =< Timestamp_Now -> {{A,B},C} end).
  69. %[{{{'$1','$2'},'$3'}, [{'=<','$3',{const,1642507256}}], [{{{{'$1','$2'}},'$3'}}]}]
  70. L = ets:select(events_table, [{{{'$1','$2'},'$3'}, [{'=<','$3',{const, Timestamp_Now}}], [{{{{'$1','$2'}},'$3'}}]}] ),
  71. lists:foldl(fun({{Task_Id0, Proc_Id0}=V, _Time0}, ok) ->
  72. % send_to_rabbitmq({call_timer, Proc_Id0, Task_Id0}),
  73. ets:delete(events_table, V),
  74. %io:format("tick: ~p ~p~n", [Task_Id0, Proc_Id0]),
  75. ok
  76. end, ok, L),
  77. %erlang:send_after(1000, self(), check_time_process),
  78. {noreply, State};
  79. handle_info(_Request, State) ->
  80. {noreply, State}.
  81. terminate(_Reason, _State) ->
  82. ok.
  83. code_change(_OldVsn, State, _Extra) ->
  84. {ok, State}.
  85. check_ets_count() -> ets:info(events_table, 'size').