Исключения в прослушивателях событий Spring невидимы, но блокируютсяJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Исключения в прослушивателях событий Spring невидимы, но блокируются

Сообщение Anonymous »

У меня возникла проблема, которая была пропущена из-за того, что исключения не были созданы в прослушивателях событий Spring.

По сути, серия событий выглядела следующим образом:
  • MyEvent опубликован
  • listener1 вызывается
  • listener2 вызывается, но обнаруживает исключение
    Нет указаний на то, что произошло исключение (например, в console/logs)
  • listener3 НЕ вызывается
Однако, когда я добавил конфигурацию для SimpleApplicationEventMulticaster, определив errorHandler, который просто регистрирует исключение, произошло следующее:
  • MyEvent опубликован
  • вызывается прослушиватель1
  • вызывается прослушиватель2, но обнаруживается исключение
  • вызывается прослушиватель3
    < li>исключение регистрируется через мой errorHandler
Мой вопрос

Если приложение не перейдет к следующему прослушивателю после исключения в стандартном конфигурации, почему он делает это, когда я настраиваю его для печати исключения?


У меня такое ощущение, что исключение «невидимо» ( нет никаких признаков того, что произошло исключение) может быть связано с тем, что я использовал Исполнителей? Однако я не понимаю несоответствия в том, являются ли исключения «блокирующими» или нет.
Моя тестовая настройка:@Configuration
public class AppConfig {

// If the following configuration is present (just logging the NPE), all listeners are invoked.
// However, if it is removed, the NPE is not recorded, and only listeners 1 and 2 are invoked.

@Bean
public SimpleApplicationEventMulticaster applicationEventMulticaster() {
SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
multicaster.setErrorHandler(throwable -> {
System.err.println("Exception in event listener: " + throwable.getMessage());
});
return multicaster;
}
}

@EnableScheduling
@Component
public class EventsTesting {

private final ApplicationEventPublisher publisher;
private final ExecutorService executor = Executors.newSingleThreadExecutor();

@Autowired
private EventsTesting(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}

// PUBLISHING MyEvent EVERY 5 SECONDS

@Scheduled(fixedRate = 5000)
private void publishEvent() {
System.out.println("PUBLISH EVENT");
executor.submit(() -> publisher.publishEvent(new MyEvent(this)));
}

// EVENT LISTENERS HANDLE THE EVENT SEQUENTIALLY

@Order(1)
@EventListener
private void handleMyEvent1(MyEvent event) {
System.out.println("LISTENER 01");
}

@Order(2)
@EventListener
private void handleMyEvent2(MyEvent event) {
System.out.println("LISTENER 02");
String npe = event.getNull().toLowerCase();
}

@Order(3)
@EventListener
private void handleMyEvent3(MyEvent event) {
System.out.println("LISTENER 03");
}

public static class MyEvent extends ApplicationEvent {

public MyEvent(Object source) {
super(source);
}

public String getNull() { return null;}
}
}


При наличии конфигурации SimpleApplicationEventMulticaster я вижу следующие журналы:
PUBLISH EVENT
LISTENER 01
LISTENER 02
LISTENER 03
Exception in event listener: Cannot invoke "String.toLowerCase()" because the return value of "com.example.eventhandlingbug.EventsTesting$MyEvent.getNull()" is null
PUBLISH EVENT
LISTENER 01
LISTENER 02
LISTENER 03
Exception in event listener: Cannot invoke "String.toLowerCase()" because the return value of "com.example.eventhandlingbug.EventsTesting$MyEvent.getNull()" is null

Однако без конфигурации я вижу это:
PUBLISH EVENT
LISTENER 01
LISTENER 02
PUBLISH EVENT
LISTENER 01
LISTENER 02


Подробнее здесь: https://stackoverflow.com/questions/792 ... t-blocking
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Имена столбцов DataTable невидимы в заголовке таблицы [дубликат]
    Anonymous » » в форуме Jquery
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Элементы QCombobox невидимы - виден только первый элемент
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Компоненты Swing невидимы
    Anonymous » » в форуме JAVA
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Как исправить значки панели состояния невидимы в приложении, начиная с Android 15
    Anonymous » » в форуме Android
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как исправить значки панели состояния невидимы в приложении, начиная с Android 15
    Anonymous » » в форуме Android
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»