Skip to content

rogetsun/EventTimer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

84 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

实现原理:
    Event事件容器
    核心容器为一个Map<String, EventHandlerQueue<EventHandler>>.key:事件名称,value:事件处理器队列
    EventHandlerQueue底层用一个ConcurrentLinkedDeque双端队列实现.

    Timer任务
    底层用ScheduledExecutorService实现.
    使用时也可以直接用TimerUtil.interval和TimerUtil.timeout传入TimerTask即可
    任务默认实现了EventTimeTask,任务内部抛出构造器入参的事件名称.

Event使用:
    实例化一个EventEmitter,同时要一个EventExecutor.这件事情在EventUtil加载到内存时已经完成.
        eventEmitter = EventEmitterFactory.getEventEmitter(new EventExecutorImpl());
    EventEmitter在事件触发时,从容器中取出事件处理器队列,启动一个线程,交给EventExecutor执行.

    所以直接用EventUtil.on(EventName, EventHandlerS)即可.
    在触发事件时用EventUtil.trigger(EventName).


20170222:
    增加trigger事件时,如果当前事件在on时,增加了分发器EventSpliter,
    则根据分发规则生成的key生成或使用已有的单独创建的EventExecutorSplitImpl(底层就是一个单独的ExecutorService)。

20170407:
    1、增加事件分级功能。从事件名称上实现。
        比如事件名称:"一级事件名@二级事件名@三级事件名"
        trigger事件时:
            如果有"一级事件名@二级事件名@三级事件名"的EventHandler则直接触发,并不再向上广播。
            如果没有则看是否有"一级事件名@二级事件名"的EventHandler。依次类推。
    2、增加事件一次性转发功能:forwardOnce。
        EventUtil.forwardOnce(String:eventName, forwarder:EventOnceForwarder)
        EventOnceForwarder为一个函数式接口
        下次eventName再被触发时,将经过函数式接口EventOnceForwarder.forward()转换触发到返回的结果事件名上。
        eg:
        EventUtil.forwardOnce("IP62", (sourceEventName, data)->{
            //todo return distEventName
        });

20170714:
    1、增加事件拦截转发功能的取消功能。
        将EventUtil.forwardOnce()返回一个事件拦截转发器Forwarder。自带取消方法cancel();
        或者通过EventUtil.cancelForward(String:eventName)
        返回是否成功取消。不成功的原因只有已经不存在该事件的拦截转发器。

20170930:
    1.增加事件分级可以向上广播功能.
        采用了不同的时间分隔符
        en1|en2可以向上广播.en1@en2出发一次后不会向上广播.
    2.增加EventUtil.shutdown()功能.
        但是一旦shutdown后尚没有重新启动功能.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages