Spring Async Uncaught Exception handler

后端 未结 4 1383
不思量自难忘°
不思量自难忘° 2020-12-09 09:08
@Override
@Async
public void asyncExceptionTest() {
    int i=1/0;
}

How can I log this using Spring Async framework without having to put try catc

4条回答
  •  离开以前
    2020-12-09 09:44

    @Async methods can be configured with a custom Executor to log any thrown exceptions.

    The following code implements this pattern. Any method tagged with @Async will use the Executor returned by the method public Executor getAsyncExecutor(). This returns the HandlingExecutor which takes care of all logging (in this case it just prints the word "CAUGHT!" but you can replace with logging.

    @Configuration
    @EnableAsync
    public class ExampleConfig implements AsyncConfigurer {
        @Bean
        public Runnable testExec() {
            return new TestExec();
        }
    
        @Override
        public Executor getAsyncExecutor() {
            final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(7);
            executor.setMaxPoolSize(42);
            executor.setQueueCapacity(11);
            executor.setThreadNamePrefix("MyExecutor-");
            executor.initialize();
            return new HandlingExecutor(executor);
        }
    }
    
    public class HandlingExecutor implements AsyncTaskExecutor {
        private AsyncTaskExecutor executor;
    
        public HandlingExecutor(AsyncTaskExecutor executor) {
            this.executor = executor;
        }
    
        @Override
        public void execute(Runnable task) {
            executor.execute(task);
        }
    
        @Override
        public void execute(Runnable task, long startTimeout) {
            executor.execute(createWrappedRunnable(task), startTimeout);
        }
    
        @Override
        public Future submit(Runnable task) {
            return executor.submit(createWrappedRunnable(task));
        }
    
        @Override
        public  Future submit(final Callable task) {
            return executor.submit(createCallable(task));
        }
    
        private  Callable createCallable(final Callable task) {
            return new Callable() {
                @Override
                public T call() throws Exception {
                    try {
                        return task.call();
                    } catch (Exception e) {
                        handle(e);
                        throw e;
                    }
                }
            };
        }
    
        private Runnable createWrappedRunnable(final Runnable task) {
            return new Runnable() {
                @Override
                public void run() {
                    try {
                        task.run();
                    } catch (Exception e) {
                        handle(e);
                    }
                }
            };
        }
    
        private void handle(Exception e) {
            System.out.println("CAUGHT!");
        }
    }
    

提交回复
热议问题