尝试取消注册处理程序时,我从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);
}
}
答案 0 :(得分:0)
从阅读EventBus
源代码开始,看起来Guava 14以后确实有足够的锁定来避免这个问题,而Guava 13及以下版本没有做任何锁定。你能使用更新版的番石榴吗?
(从错误消息中可以清楚地看出,你不会使用最新的番石榴,因为Guava 16以后会调用处理程序"订阅者等等。)