2014-06-18 69 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號以後將處理者稱爲「訂閱者」)。

相關問題