Исключения в @Async методах. Spring

231
22 сентября 2017, 18:13

Есть контекст со слушателем.

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    servletContext.addListener(SentryServletRequestListener.class);
    super.onStartup(servletContext);
}

и два метода. Один из них помечен аннотацией @Async

@Async
public void send(Long providerId, String name, String email) {
    throw new RuntimeException();
}
public void load(Long providerId, String name, String email) {
    throw new RuntimeException();
}

Слушатель реагирует на исключения НЕ асинхронных методов. Вопрос: можно ли настроить и как, чтобы реакция была и на исключения из АСИНХРОННЫХ методов. Заранее спасибо

Answer 1

Асинхронные методы выполняются в отдельном потоке, возникающие исключения в нём и остаются, вызывающий поток о них никак узнать не может. Для обработки асинхронных исключения нужно объявить отдельный слушатель:

public class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        System.out.println("Exception message - " + throwable.getMessage());
        System.out.println("Method name - " + method.getName());
        for (Object param : obj) {
            System.out.println("Parameter value - " + param);
        }
    }
}

И зарегистрировать его в контексте:

<task:annotation-driven executor="someExecutorBean" exception-handler="asyncExceptionHandler"/>
<bean id="asyncExceptionHandler" class="com.example.MyAsyncExceptionHandler"/>

Или, если у вас используется java-конфигурация:

@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        return new ThreadPoolTaskExecutor();
    }
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new MyAsyncExceptionHandler();
    }
}
READ ALSO
Передать переменную из JS (Phonegap 7) в Java (Android 4.4)

Передать переменную из JS (Phonegap 7) в Java (Android 4.4)

Как передать переменную из Phonegap 7 JS в Android Java? Я читал на SO анлгоязычные решения, но многие они либо старые, либо просто не подходят в моём случае

260
JavaFX: Объединение Filechooser и DirectoryChooser

JavaFX: Объединение Filechooser и DirectoryChooser

Мой тул заменяет текст файлов (их название и/или содержимое)Собственно для этих целей мне нужно, как иметь возможность выбирать название...

190
java.lang.IllegalStateException при создании фрагмента в DialogFragment

java.lang.IllegalStateException при создании фрагмента в DialogFragment

При попытке создать фрагмент внутри DialogFragment приложение вылетает, а в стэктрэйсе такое описание проблемы:

228
Счетчик времени (Java)

Счетчик времени (Java)

Есть сервер, на нем некоторый класс, при создании объекта которого начинается отсчет времениОтсчет идет до тех пор пока существует объект

222