SpringBoot中Async异步方法和定时任务介绍(2)


    @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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/32180a59d8a1c0272a90dd24442e5fec.html