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 и далее называет обработчики "подписчиками".)