本文主要简述下如何设置TaskExecutor的Thread.UncaughtExceptionHandler。java
@Bean protected ThreadPoolTaskScheduler taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(50); executor.setQueueCapacity(100); executor.setThreadNamePrefix("demo-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.setWaitForTasksToCompleteOnShutdown(true); executor.initialize(); return executor; }
使用spring托管TaskExecutor的好处就是能够在spring容器启动或销毁的时候作些准备或清理动做。分别能够用initMethod及destroyMethod来指定。 destroyMethod默认寻找public的命名为close或者shutdown的无参方法,这里没有配置,默认调用的是ThreadPoolTaskScheduler的shutdown方法。spring
spring默认会给async的线程池配SimpleAsyncUncaughtExceptionHandler,具体见spring-context-4.3.9.RELEASE-sources.jar!/org/springframework/scheduling/annotation/AsyncAnnotationAdvisor.javaasync
不过本身配置的taskExecutor就没有这个福利了,须要本身配置,以下:ide
final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { //do what you want } }; ThreadFactoryBuilder threadFactoryBuilder = new ThreadFactoryBuilder(); threadFactoryBuilder.setNameFormat("demo-%d"); threadFactoryBuilder.setUncaughtExceptionHandler(uncaughtExceptionHandler); executor.setThreadFactory(threadFactoryBuilder.build());
这样就大功告成了ui