首页 > 其他 > 详细

给Guava的EventBus添加StickyEvent功能(未全面测试,引用需谨慎)

时间:2015-04-28 12:09:19      阅读:153      评论:0      收藏:0      [点我收藏+]
static { // Version 0.1
    def stickyEvents = new ConcurrentHashMap<Class, Object>()
    com.google.common.eventbus.EventBus.metaClass.registerSticky = { object ->
        Multimap<Class, ?> methodsInListener = delegate.finder.findAllSubscribers(object)
        delegate.subscribersByTypeLock.writeLock().lock()
        try {
            delegate.subscribersByType.putAll(methodsInListener)
            // dispatch sticky events
            methodsInListener.entries().each { e1 ->
                Class eventType = e1.key
                def wrapper = e1.value

                stickyEvents.entrySet().each { entry ->
                    Class candidateEventType = entry.key

                    if (eventType.isAssignableFrom(candidateEventType)) {
                        def stickyEvent = entry.getValue()
//                            println("sticky Dispatch $candidateEventType   Want: $eventType  $wrapper $stickyEvent")
                        delegate.enqueueEvent(stickyEvent, wrapper)
                    }
                }
            }
        } finally {
            delegate.subscribersByTypeLock.writeLock().unlock()
        }
        delegate.dispatchQueuedEvents()
    }
    com.google.common.eventbus.EventBus.metaClass.postSticky = { event ->
        synchronized (stickyEvents) {
            stickyEvents.put(event.class, event)
        }
        delegate.post(event)
    }
}



已知BUG:stickyEvents是全局的,实际上每个EventBus需要独立的stickyEvents。由于项目中只需要EventBus单例,同时也没有特别好的解决方法,暂时先这样。

原则No.1:代码美观

给Guava的EventBus添加StickyEvent功能(未全面测试,引用需谨慎)

原文:http://my.oschina.net/u/580483/blog/407114

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!