读书人

关于erlang中的整点/成天报时接口

发布时间: 2012-08-21 13:00:21 作者: rapoo

关于erlang中的整点/整天报时接口

今天由于游戏的某些整点报时的需要,比如游戏排行榜数据得在凌晨更新一次,系统发给新手的每日新手倒计时奖励得每日凌晨更新一次,还有某些每到整点就需要触发的事情。鉴于考虑这个整点报时的可复用性,就计划写一个统一的接口,让erlang中的每一个进程在调用了这个接口注册之后,都能按时收到一个 info 消息,有了这样的一个高大全,定时就简单得多了。

%% @spec start_timely_info(integer(), integer()) -> {ok, TRef} | {error, Reason}
%% @doc 调用此接口,需要在info 中添加 消息接收
%% do_info({'do_timely_info', CallBack, Kind, Num}, State) ->
%% ?? ?lib_timely_info:start_timely_info(CallBack, Kind, Num, 1),
%% ?? ?{noreply, State};
%% 其中CallBack是改计时器需要定时触发的回调函数
%% 定时类型(按天(2)、小时(1)、星期(3))
%% -define(TIMELY_KIND_HOUR,?? ?1).
%% -define(TIMELY_KIND_DAY,?? ?2).
%% -define(TIMELY_KIND_WEEK,?? ?3).
%% % ---------------------
%% % 定时器抛出的事件是否激活(0表示不激活,1表示激活)
%% -define(TIMELY_HANDLE_ACTIVE,?? ??? ?1).
%% -define(TIMELY_HANDLE_NOT_ACTIVE,?? ?0).
%% ---------------CallBack---Kind---Num-- Active-----------
%% ---------------回调函数--定时类型-数量-是否激活回调函数----
start_timely_info(CallBack, Kind, Num,Active) ->
?? ?if Active =:= 1 ->
?? ??? ?{M,F,A} = CallBack,
?? ??? ?erlang:apply(M,F,A);
?? ??? true ->
?? ??? ??? skip
?? ?end,
?? ?Now = misc_timer:now_seconds(),
?? ?LeftTime =?
?? ??? ?case Kind of
?? ??? ??? ??HOUR ->
?? ??? ??? ???? ?ONE_HOUR - misc_timer:now_seconds() rem ?ONE_HOUR + (Num -1) * ?ONE_HOUR;
?? ??? ??? ??DAY ->
?? ??? ??? ???? util:get_next_day_seconds(Now) - Now + (Num - 1) * ?ONE_DAY;
?? ??? ??? ?_ ->
?? ??? ??? ??? ??ONE_WEEK
?? ??? ?end,
?? ?timer:send_after(LeftTime * 1000, self(),{'do_timely_info', CallBack, Kind, Num}).

?

在调用接口的同时,若传入回调函数,让改接口函数定时给执行的话,只需要将回调函数 Callback 当做参数传入就可以了

另:为满足某些特殊需求,比如我在注册的时候就需要启动一次这个回调函数,因此增加一个参数来确定是不是需要立即执行回调函数

读书人网 >编程

热点推荐