在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) {
//处理异常
}
//同步方法
}
}