繁体   English   中英

Spring 启动异步

[英]Spring boot Async

我不确定 Spring 引导异步如何工作? 我知道网络服务器有自己的线程池,每个请求都由池中的一个线程处理。 现在,当我们使用 spring 启动和配置实现异步 web 服务时,假设有 10 个线程,这是否意味着线程中有线程? 澄清一下,web 服务器会将请求分配给线程。 现在,当该线程开始执行并调用标有@Asynch 的服务/函数时,它可以创建多个线程来处理请求。 请让我知道我的理解是否正确。

它不是另一个内部的线程。 @Async 将使请求在单独的线程中执行,并且请求的调用者不会等待被调用的方法完成

要启用异步,您可以添加,

@Configuration
@EnableAsync
public class AsyncExample {
   // Define a threadpool executor if needed,
   @Bean(name = "threadPoolTaskExecutor")
   public Executor threadPoolTaskExecutor() {
      return new ThreadPoolTaskExecutor();
   }
}

然后您可以使用定义的线程池执行程序定义如下异步方法,

@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
   // Method Definition
}

使用@Async 将使其在单独的线程中执行,即调用者不会等待被调用方法的完成。 并且可以配置使用的 Executor

@Configuration
@EnableAsync
public class SpringAsyncConfig {

    @Bean(name = "fooExecutor")
    public Executor fooExecutor() {
        return new ThreadPoolTaskExecutor();
    }
}

并使用 @Async("fooExecutor")

您可以进行如下配置来控制更多的线程参数,例如带前缀的线程名称,池大小,...这样您就可以确保您控制线程池。

   @Configuration
    @EnableAsync
    public class AsyncConfiguration implements AsyncConfigurer {

        @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(5);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(5000);
            executor.setThreadNamePrefix("MyThread-");
            executor.setWaitForTasksToCompleteOnShutdown(true);
            executor.initialize();
            return executor;
        }

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

然后将 @Async 注释放在代码 bean 或要使其异步的方法上。

有关此主题的更多信息,您可以在此处参考 spring 的调度文档。

我希望你会觉得这很有帮助;)

暂无
暂无

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

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