繁体   English   中英

Spring 引导异步编程

[英]Spring Boot Async Programming

我是软件新手。 我正在努力了解 Spring Boot 中的异步编程。 如上所示,我将线程池大小设置为 2。当我依次请求相同的 url 三次时。 我的两个请求是异步工作的。 第三个正在等待。 还行吧。 但是当我不使用异步功能(既不使用@async 注释也不使用线程池)时,它仍然像以前一样异步执行事务。 所以我很困惑。 Spring 引导 rest controller 默认行为异步? 为什么我们在 Spring 引导中使用@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 引导的默认嵌入式 Tomcat。 如果是这样,那你就没有误会。 Tomcat 默认情况下确实会异步工作,这意味着它将为每个请求启动一个新线程(请参阅内容)。

@Async注解的目的不是要替换 Tomcat 在这种情况下提供的功能。 相反,该注释允许在单独的线程中执行 bean 的任何方法。 对于您的特定用例,让 Tomcat 为每个请求启动一个新线程可能就足够了,但有时您可能希望进一步并行化工作。

当一个请求必须触发一些繁重的计算,但响应不依赖于它时,您可能希望同时使用两者的一个示例是。 通过使用@Async注解,您可以在另一个线程上启动繁重的计算,并让请求更快地完成(有效地允许服务器处理其他请求,而繁重的计算在另一个线程上独立运行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM