Guava eventBus сообщает об отсутствии обработчика событий при отмене регистрации

Я получаю следующую ошибку от 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, который работает с несколькими потоками (в данном случае только 2). Несмотря на то, что eventBus спроектирован как поточно-ориентированный, ошибка появлялась только во время большого трафика и возникала только несколько раз после тысяч вызовов.

Экземпляр обработчика просто хранит 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 ответ

Из чтения EventBus Исходя из исходного кода, кажется, что Guava 14 и далее делает достаточную блокировку, чтобы избежать этой проблемы, тогда как Guava 13 и ниже не делает никакой блокировки. Можете ли вы использовать более новую версию Guava?

(Из сообщения об ошибке видно, что вы используете не последнюю версию Guava, поскольку Guava 16 и далее называет обработчики "подписчиками".)

Другие вопросы по тегам