1

尝试注销处理程序时,我从 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 处理器 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);
    }
}
4

1 回答 1

0

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

(从错误消息中可以清楚地看出,您不在最新的 Guava 上,因为 Guava 16 及更高版本将处理程序称为“订阅者”。)

于 2014-06-30T11:09:36.757 回答