Spring Boot 异步调用@Async

JAVA中可以自己创建线程等多种方式来实现异步调用,在spring3.0中,引入了@Async注解,让开发者能够更方便的实现异步效果。下面来看看再SpringBoot中如何正确的使用异步调用。

一、启动类中,使用@EnableAsync注解开始异步功能

@SpringBootApplication
@EnableAsync
public class YCloudsServiceDemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication
            .run(YCloudsServiceDemoApplication.class, args);
    }
}

二、调用方

@RequestMapping("/test")
public ApiResp test() {
    log.info("step: {}", 1);
    testService.doTest();
    log.info("step: {}", 4);
    return ApiResp.retOK();
}

二、被调用方,用@Async注解标注需要异步执行的方法

@Override
@Async
public void doTest() {
    log.info("step: {}", 2);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.info("step: {}", 3);
}

然后看看执行效果:

可以看到不是按照1234输出,而且线程名发生了改变,也就是说,已经实现了异步调用的效果。

========================================================================================

题外补充:

1、如果调用方,和异步方法在同一个类中,是不能实现异步调用的。

2、如果用@Async注解标识一个类的话,这个类的所有public方法都会变成异步的

3、我们可以通过实现AsyncConfigurer接口来定制化异步调用线程的配置。如线程名、线程池大小、甚至是异常处理

org.springframework.scheduling.annotation.AsyncConfigurer

@Slf4j
@Configuration
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setThreadNamePrefix("ThreadName-");
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new AsyncExceptionHandler();
    }

    private class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

        @Override
        public void handleUncaughtException(Throwable throwable, Method method, Object... objects) {
            
            log.warn(throwable.getMessage(), throwable);
            // 做一些你想做的事情
        }
    }
}

 

GitHub地址:https://github.com/ye17186/spring-boot-learn

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值