У меня есть класс конфигурации как таковой:
@Configuration
@EnableAsync
@EnableScheduling
@EnableTransactionManagement
public class SpringAsyncConfiguration implements AsyncConfigurer {
@Autowired
private AppConfigProperties appConfigProperties;
@Autowired
private AsyncExceptionHandler asyncExceptionHandler;
@Bean("asyncExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(appConfigProperties.getThreadpoolCorePoolSize());
executor.setMaxPoolSize(appConfigProperties.getThreadpoolMaxPoolSize());
executor.setQueueCapacity(appConfigProperties.getThreadpoolQueueCapacity());
executor.setThreadNamePrefix("threadPoolExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return asyncExceptionHandler;
}
}
И Исключение Хендлер здесь:
@Component
@Slf4j
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
@Autowired
private SynchronizationHelper synchronizationHelper;
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
log.error("*** ASYNC Exception message - " + throwable);
if("synchronize".equals(method.getName())) {
synchronizationHelper.(...)
(...)
}
}
}
Проблема заключается в том, что при необработанном исключении (в методе, отмеченном @Async
), он не проходит через метод handleUncaughtException
, даже если getAsyncUncaughtExceptionHandler()
возвращает правильный компонент.
Есть идеи?
UPDATE
Я выяснил, что при удалении автопроводки в моем классе AsyncExceptionHandler (, что не то, что я хочу ), он затем входит в метод handleUncaughtException
при необработанном исключении.
Почему это?