Обработка исключений, создаваемых методами Spring @Async ⇐ JAVA
-
Гость
Обработка исключений, создаваемых методами Spring @Async
В моем приложении Spring Boot у меня есть метод, который отправляет электронные письма, выполняя (блокируя) HTTP-вызовы к API SendGrid. В некоторых случаях я вызываю этот метод несколько раз для каждого запроса, поэтому, чтобы смягчить влияние на поток запросов, я вызываю этот метод асинхронно, аннотируя его с помощью @Async.
публичный класс EmailService { @Асинхронный public void send (адрес строки, тема строки, тело строки) { // делаем HTTP-вызов API SendGrid } } общественный класс PasswordService { @Autowired частная служба электронной почты emailService; public void resetAll(String emailAddresses) { emailAddresses.forEach(электронная почта -> { emailService.send(email, «Ваш новый пароль», «open-sesame»); }); } } @ControllerAdvice общественный класс GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public void handleException (Exception ex) { ex.printStackTrace(); } } Проблема этого подхода в том, что он обходит обработку исключений приложения. Если emailService.send генерирует исключение, глобальный обработчик исключений не вызывается, и поэтому клиенту не возвращается HTTP-статус 500.
Если я удалю @Async, глобальные обработчики исключений будут вызываться, как и ожидалось. Как я могу вызвать этот метод асинхронно, не минуя глобальный обработчик исключений?
В моем приложении Spring Boot у меня есть метод, который отправляет электронные письма, выполняя (блокируя) HTTP-вызовы к API SendGrid. В некоторых случаях я вызываю этот метод несколько раз для каждого запроса, поэтому, чтобы смягчить влияние на поток запросов, я вызываю этот метод асинхронно, аннотируя его с помощью @Async.
публичный класс EmailService { @Асинхронный public void send (адрес строки, тема строки, тело строки) { // делаем HTTP-вызов API SendGrid } } общественный класс PasswordService { @Autowired частная служба электронной почты emailService; public void resetAll(String emailAddresses) { emailAddresses.forEach(электронная почта -> { emailService.send(email, «Ваш новый пароль», «open-sesame»); }); } } @ControllerAdvice общественный класс GlobalExceptionHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public void handleException (Exception ex) { ex.printStackTrace(); } } Проблема этого подхода в том, что он обходит обработку исключений приложения. Если emailService.send генерирует исключение, глобальный обработчик исключений не вызывается, и поэтому клиенту не возвращается HTTP-статус 500.
Если я удалю @Async, глобальные обработчики исключений будут вызываться, как и ожидалось. Как я могу вызвать этот метод асинхронно, не минуя глобальный обработчик исключений?
Мобильная версия