`
vanadiumlin
  • 浏览: 493257 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

关于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 当做参数传入就可以了

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

相关推荐

Global site tag (gtag.js) - Google Analytics