Проблема автопроводки в реализации AsyncUncaughtExceptionHandler - PullRequest
0 голосов
/ 31 октября 2018

У меня есть класс конфигурации как таковой:

@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 при необработанном исключении.

Почему это?

1 Ответ

0 голосов
/ 02 ноября 2018

Проблема возникла из

@Autowired
private SynchronizationHelper synchronizationHelper;

Бин synchronizationHelper был автоматически подключен ко многим бинам и т. Д., Которые каким-то образом (я не совсем понимаю, как именно) отключили поведение asyncExceptionHandler.

Я создал простой компонент @Service, который делает только то, что мне нужно в моем методе handleUncaughtException (который обновляет состояние моей задачи в БД), который я автоматически подключил таким же образом, и теперь все работает нормально .. .

У меня нет времени для дополнительных расследований, если кто-то что-то знает, это будет приветствоваться.

...