2014-06-18 70 views
1

当我试图注销处理程序时,从Guava事件总线中收到以下错误。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次之后才出现几次。

处理程序实例只是存储骆驼交易所,如果构造失败,我们会快速失败。

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); 
    } 
} 

回答

0

从阅读EventBus源代码,似乎番石榴14日起不足够的锁定来避免这个问题,而番石榴13及以下不做任何锁定。你可以使用更新版本的番石榴吗?

(从错误信息中可以清楚地看出,你并不是最新的番石榴,因为番石榴16号以后将处理者称为“订阅者”)。

相关问题