0

我有一个这样的配置类:

@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;
    }
}

以及这里的 ExceptionHandler:

@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.(...)
            (...)
        }
    }

}

问题是,在未捕获的异常上(在用 注释的方法中) ,即使返回正确的 bean @Async,它也不会通过方法。handleUncaughtExceptiongetAsyncUncaughtExceptionHandler()

任何想法?

更新

我发现删除我的类 AsyncExceptionHandler 中的自动装配(这不是我想要的),然后它进入handleUncaughtException未捕获异常的方法。

这是为什么?

4

1 回答 1

0

问题源于

@Autowired
private SynchronizationHelper synchronizationHelper;

该 beansynchronizationHelper与许多 bean 等自动装配,不知何故(我不清楚究竟是如何)禁用asyncExceptionHandler.

我创建了一个简单的@Servicebean,它只在我的方法中做我需要的事情handleUncaughtException(它正在更新我在 DB 中的任务状态),我以同样的方式自动装配了它,现在一切正常......

我没有时间在这里进行额外的调查,如果有人有任何想法,那将是受欢迎的。

于 2018-11-02T10:48:40.297 回答