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

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:代码美观

时间: 2024-10-13 03:42:17

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

ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: 1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width&qu

添加相关功能

第二章 添加相关功能 本项目需要用到的板载资源包括:GPIO.串口3路.定时器中断.外部中断. GPIO配置 串口配置 串口初始化 下面给出三路串口的接收和发送对应的IO口: 串口号 发送(TX) 接收(RX) debugUsart(USART1) PA9 PA10 printUsart(USART2) PA2 PA3 lcdUsart(USART3) PB10 PB11 表 1串口管脚分布 在BSP.c文件中定义如下三个串口初始化函数,同时将这三行添加到BSP.h文件里,对函数进行声明: (1

跟陈湾来完善C++(2), 添加属性功能

上面几篇文章中,我们添加了名称空间优化,添加事件功能.这些对我来说其实已经够了.但还可以加一个属性功能. 当我们在C++中更改一个属性时,平常都是Get函数加上Set函数,但是这样,没有直接写一个成员变量方便.例如: a.SetValue(a.GetValue() + 1); 没有 a.Value = a.Value + 1; 方便. 但是这种方便只有在调用有属性功能的对象时才能使用.在创建属性的时候我还是用老套路,写一个Get和Set函数,该干啥还是干啥.我的属性功能其实就是在类中添加一个共有

【转】为Android应用添加搜索功能

为Android应用添加搜索功能 为Android应用增加搜索功能:增加搜索建议

修复Bug是重点 iOS9将不注重添加新功能

苹果iOS7系统时发生了界面风格的巨大改变,目前的iOS8也在延续之前的风格,只是进行了功能补充,那么iOS9是否还会继续保持这样的风格呢?据外媒消息,iOS9的确不会再次对风格进行大修大改,而是着重改进稳定性和系统优化. iOS9将不注重添加新功能(图片来自MacWorld) 据外媒从苹果内部工程师处获知,iOS9的主要工作是修复漏洞.保持系统的稳定性,并增强系统性能,并不会特别注重对新功能的开发. 另外,近期苹果因iOS8系统固件体积过大而多次被用户告上法庭,看来是起到了一定效果.据称苹果将

java-第十四章-代参的方法(二)-实现MyShopping系统的添加会员功能

 package com.wxws.sms; public class Customer {  int No;  int integarl; } package com.wxws.sms; public class Customers {  Customer[] customers = new Customer[100];  public void add(Customer cust){   for (int i = 0; i <customers.length; i++) {    if (c

(译)Windsor入门教程---第五部分 添加日志功能

介绍 现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. Logging Facility 在上一部分说过,Windsor有很多自带的可选的功能组件,他们扩展了Windsor的即用性.在这一部分,我们将在程序中添加日志功能. Logging Facility提供了一些常用的日志框架比如Log4net.Nlog,以及mvc内置的日志框架Trace.Logging Fa

python之选课系统详解[功能未完善]

作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类--   2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能       遇到的困难: 1.在类与类关联上卡住了,比如: 老师如何查看班级信息?? 老师有班级名称的属性, 而要查看班级信息,需要班级对象 那应该将老师的班级名称与班级对象相关联起来 那不同老师怎么办?? 所以学校创建 老师对象时,应该将老师名称与老师对象相关联起来 通过输入老师名称即可找到老师对象 2. 想把讲师对

C#数据层添加事务功能

例子 public bool Save(ProjectModel project) { int Result = 0; SqlConnection Conn = new SqlConnection(SqlHelper.connectionString); Conn.Open(); SqlTransaction Trans; Trans = Conn.BeginTransaction(); try { SqlParameter[] sqlParameter1 = new SqlParameter[