Guava eventBus在取消注册时报告“缺少事件处理程序”

时间:2014-06-18 13:45:52

标签: guava event-bus

尝试取消注册处理程序时,我从Guava eventBus收到以下错误。

java.lang.IllegalArgumentException: missing event handler for an annotated method. Is [DerivedClass] registered?" at com.google.common.eventbus.EventBus.unregister(EventBus.java:227)

已经回答了一个相同的问题,但根本原因是客户端编码错误。 在我的情况下,我正在做的一切非常简单,但仍然遇到问题。

客户端代码是一个Apache Camel Processor bean,它运行多个线程(在这种情况下只有2个)。尽管eventBus设计为线程安全的,但错误仅在高流量时浮出水面,并且在1000次调用后仅被提升了几次。

处理程序实例只存储Camel Exchange,如果构造失败,我们将快速失败。

public void process(Exchange exchange) throws Exception {
    MyHandler evHandler = new MyHandler(exchange);
    eventBus.register(evHandler);

    try {
        doStuff(exchange);
    }
    catch (Foo bar) {
        // stuff
    }
    finally {
        eventBus.unregister(evHandler);
    }
}

1 个答案:

答案 0 :(得分:0)

从阅读EventBus源代码开始,看起来Guava 14以后确实有足够的锁定来避免这个问题,而Guava 13及以下版本没有做任何锁定。你能使用更新版的番石榴吗?

(从错误消息中可以清楚地看出,你不会使用最新的番石榴,因为Guava 16以后会调用处理程序"订阅者等等。)