c语言编程笔录

首页 >   > 笔记大全

笔记大全

在spring boot中怎么使用Async实现异步调用

更新时间:2023-11-09

什么是@Async

@Async是Spring框架中的一个注解,它能够将一个普通的Java函数变成异步调用的方法,让该方法在异步线程中执行,从而不会阻塞主线程。@Async注解只能应用在public修饰符的方法上,而且必须要调用经过@Autowired注解的类的方法,否则无效。

@Service
public class AsyncService {

    @Async
    public Future<Object> asyncCall() {
        //异步调用
    }
}

在spring boot中怎么使用@Async实现异步调用

在使用Spring Boot框架时,我们可以利用@EnableAsync注解的方式来开启对异步调用的支持,具有@Async注解的方法就可以异步执行。我们可以在任何时候使用@Async注解,布置任何类型的异步任务,包括数据库,消息队列,磁盘I/O等等操作。

@Service
public class AsyncService {

    @Async
    public Future<Object> asyncCall() {
        //异步调用
    }
}

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(100);
        executor.initialize();
        return executor;
    }
    
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;   
    }
}

异步方法何时可用

异步方法可以在任何时候被调用,包括在同步代码块中。在同步代码块中调用异步方法,该方法将会在异步线程中执行,不会影响同步线程的进程。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private AsyncService asyncService;

    @Override
    public User getUserByUsername(String username) {
        //同步方法
        asyncService.asyncCall();
        //同步方法
    }
}

异常处理和返回值

当异步方法抛出异常时,我们还可以通过使用AsyncUncaughtExceptionHandler来处理这些异常情况。我们可以通过返回Future,CompletableFuture,ListenableFuture等异步调用方式的异步返回值来使用返回值。

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(100);
        executor.initialize();
        return executor;
    }
    
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (throwable, method, objects) -> {
            log.error("Error Occurs: {} in method {}", throwable.getMessage(), method.getName());
        };  
    }
}

@Service
public class AsyncService {

    @Async
    public CompletableFuture<Object> asyncCall() {
        //异步调用,可能会抛出异常
        //...
        //返回一个结果
        return CompletableFuture.completedFuture(object);
    }
}

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private AsyncService asyncService;

    @Override
    public User getUserByUsername(String username) {
        //同步方法
        CompletableFuture<Object> future = asyncService.asyncCall();
        try {
            Object result = future.get();
            //处理返回值
        } catch (InterruptedException | ExecutionException e) {
            //处理异常                    
        }
        //同步方法
    }
}