@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
//返回值为void的异步方法不会传递异常,当方法中出现异常的时候只会打印日志,重写此方法来自定义异常处理方法
return null;
}
}
这种定义的方法缺点是没有定义bean。
方法二:自定义相应类型的线程池bean。
第二种方法是基于Spring对线程选择的原理来实现的,定义一个类型为TaskExecutor的bean,定义方式如下:
@Bean
public TaskExecutor asyncTaskThreadPool() {
ThreadPoolTaskExecutor asyncTaskThreadPool = new ThreadPoolTaskExecutor();
asyncTaskThreadPool.setCorePoolSize(100);
asyncTaskThreadPool.setMaxPoolSize(200);
asyncTaskThreadPool.setThreadFactory(new ThreadFactory() {
private final AtomicLong index = new AtomicLong(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "Async-task-pool-thread-" + index.getAndIncrement());
}
});
// asyncTaskThreadPool.initialize();//当为bean的时候不需要调用此方法,装载容器的时候回自动调用
return asyncTaskThreadPool;
}
以上两种方式定义线程池的时候在定义异步方法可以不执行线程池。定义如下:
@Async
public void test(){
System.out.println(Thread.currentThread().getName());
}
此时Spring会自动使用以上定义的线程池执行此方法。使用以上两种配置输出结果依次是:
Async-task-pool-thread-1
Async-task-override-pool-thread-1
方法三 在Async注解中执行线程池名称
异步任务定义如下:
@Async(value = "asyncTaskThreadPool")
public void asyncTask2() {
LOGGER.info("AsyncTask2 start.");
LOGGER.info(Thread.currentThread().getName());
LOGGER.info("AsyncTask2 finished.");
}
此时Spring会在上下文中找名称为asyncTaskThreadPool的线程池来执行此任务。
类似的可以自定义Scheduled的线程池,需要实现的配置接口为:SchedulingConfigurer。方法类似。
4.Async返回操作结果
异步任务可以通过定义返回类型为Future来实现返回值,定义如下:
@Async
public Future<String> asyncTaskWithResult() {
LOGGER.info("AsyncTaskWithResult start.");
try {
Thread.sleep(1000 * 10);
} catch (Exception e) {
return new AsyncResult<>("error" + e.getMessage());
}
LOGGER.info("AsyncTaskWithResult finished.");
return new AsyncResult<>("success");
}
5.编写单元测试测试功能
单元测试代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncApplicationTests {
@Autowired
private AsyncTaskService asyncTaskService;
@Test
public void asyncTest() throws Exception{
Future<String> future = asyncTaskService.asyncTaskWithResult();
while (!future.isDone()) {
System.out.println("Wait asyncTaskWithResult.");
Thread.sleep(1000);
}
System.out.println("asyncTaskWithResult result is:" + future.get());
System.out.println("asyncTask finished.");
}
}
输出内容如下:
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
Wait asyncTaskWithResult.
AsyncTaskWithResult finished.
asyncTaskWithResult result is:success
asyncTask finished.
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx