java - Spring Boot 异步编程
问题描述
我是软件新手。我正在努力了解 Spring Boot 中的异步编程。如上所示,我将线程池大小设置为 2。当我一次又一次地请求相同的 url 三次时。我的两个请求是异步工作的。第三个正在等待。还行吧。但是当我不使用异步功能(既不使用@async 注释也不使用线程池)时,它仍然像以前一样异步执行事务。所以我很困惑。Spring Boot 休息控制器默认行为异步?为什么我们在 Spring Boot 中使用 @async?还是我对此有误解?
@Service
public class TenantService {
@Autowired
private TenantRepository tenantRepository;
@Async("threadPoolTaskExecutor")
public Future<List<Tenant>> getAllTenants() {
System.out.println("Execute method asynchronously - "
+ Thread.currentThread().getName());
try {
List<Tenant> allTenants = tenantRepository.findAll();
Thread.sleep(5000);
return new AsyncResult<>(allTenants);
} catch (InterruptedException e) {
//
}
return null;
}
}
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(2);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("AsynchThread-");
executor.initialize();
return executor;
}
@Bean(name = "threadPoolTaskExecutor2")
public Executor threadPoolTaskExecutor2() {
return new ThreadPoolTaskExecutor();
}
}
解决方案
我假设您使用的是 Spring Boot 中的默认嵌入式 Tomcat。如果是这样,那你就没有误会。默认情况下,Tomcat 确实会异步工作,这意味着它将为每个请求启动一个新线程(请参阅this for on that)。
该@Async
注释的目的不是要替换 Tomcat 在这种情况下提供的功能。相反,该注释允许在单独的线程中执行 bean 的任何方法。对于您的特定用例,让 Tomcat 为每个请求启动一个新线程可能就足够了,但有时您可能希望进一步并行化工作。
当一个请求必须触发一些繁重的计算,但响应不依赖于它时,您可能希望同时使用两者的一个示例是。通过使用@Async
注解,您可以在另一个线程上启动繁重的计算,并让请求更快完成(有效地允许服务器处理其他请求,而繁重的计算在另一个线程上独立运行)。
推荐阅读
- kubernetes - 从 GitLab CI 作业向 Kubernetes Pod 发送信号
- html - 如何创建 if else 语句以从角度删除项目
- javascript - 我可以在不安装 Redux 的情况下在 React 应用程序中受益于 Redux 的核心原则吗?
- c++ - 您可以使用 Google Test 将复杂类型传递给参数化测试吗?
- node.js - 在没有目录的firebase存储中获取文件
- django - 使用 Django 通道发送图像
- c - 当我尝试在 int d 中输入一些值时,为什么链表会出错?
- java - 无法使用来自集群外部机器(Windows)的 java 类的 JDBC 连接到 Kerberized HIVE/hadoop 集群(linux)
- c++ - 在 Visual Studio 的同一个项目中创建多个 C++ 文件
- javascript - Shopify:单击按钮时如何将产品名称添加到输入字段表单?