Spring BootはWebAsyncTaskを使って非同期で結果を返します。


Spring Boot(Spring MVC)ではデフォルトは同期であり、一つの要求は過去から最後まで一つのスレッドによって担当されています。スループットを向上させるために、いくつかの操作を非同期化する必要があります。時間のかかる業務ロジックを除いて、私たちの照会インターフェースも非同期的に実行できます。
一つの要求はサービス上で、スレッドhttp-nio-808-exc-1のようなウェブコンテナのスレッドで受信される。
WebAsyncTaskを使用してこの要求を新しいスレッドに配布して実行してもいいです。http-nio-808-exc-1は他の要求の処理を受けることができます。WebAsyncTaskがデータを返すと、再起動されて処理され、非同期的に生成された方法で要求側に値を返します。
サンプルコードは以下の通りです。

@RequestMapping(value="/login", method = RequestMethod.GET)
public WebAsyncTask<ModelAndView> longTimeTask(){
  System.out.println("/login    thread id is : " + Thread.currentThread().getName());
  Callable<ModelAndView> callable = new Callable<ModelAndView>() {
      public ModelAndView call() throws Exception {
        Thread.sleep(1000); /       
        ModelAndView mav = new ModelAndView("login/index");
        System.out.println("     thread id is : " + Thread.currentThread().getName());
        return mav;
      }
  };
  return new WebAsyncTask<ModelAndView>(callable);
}
出力結果は以下の通りです。
/login呼び出されたthread id is:http-nio-808-exec-1
実行成功thread id is:MvcAsync 1
業務ロジックを実行する前のスレッドと業務ロジックを具体的に処理するスレッドは同じではなく、目的を達成しました。
そして、同時テストをして、MvcAsync 1というスレッドを作成しているのを発見しました。スレッド池を使っていませんか?
ソースを読んでやっと気づいたのですが、WebAsyncManagerはSpring MVC管理async processingの中心クラスです。
デフォルトでは、SimpleAsyncTaskExectorを使用しています。これは要求ごとに新しいスレッドを作成します。

private AsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor(this.getClass().getSimpleName());
タスクがexectorを指定したら、タスクで指定します。なしにデフォルトのSimpleArync TaskExectorを使います。

AsyncTaskExecutor executor = webAsyncTask.getExecutor();
if (executor != null) {
  this.taskExecutor = executor;
}
私たちはasyncのスレッドを設定できます。各タスクを個別に指定する必要はありません。
configrer.set TaskExectorを通じて;を選択します

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.context.request.async.TimeoutCallableProcessingInterceptor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
  @Override
  public void configureAsyncSupport(final AsyncSupportConfigurer configurer) {
    configurer.setDefaultTimeout(60 * 1000L);
    configurer.registerCallableInterceptors(timeoutInterceptor());
    configurer.setTaskExecutor(threadPoolTaskExecutor());
  }
  @Bean
  public TimeoutCallableProcessingInterceptor timeoutInterceptor() {
    return new TimeoutCallableProcessingInterceptor();
  }
  @Bean
  public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor t = new ThreadPoolTaskExecutor();
    t.setCorePoolSize(10);
    t.setMaxPoolSize(50);
    t.setThreadNamePrefix("YJH");
    return t;
  }
}
設定が終わったら出力スレッドの名前がYJHで始まります。また新しいスレッドが作成されているわけではありません。
出力結果は以下の通りです。

/login    thread id is : http-nio-8084-exec-1
     thread id is : YJH1
締め括りをつける
以上は小编が绍介したSpring BootがWebAsyncTaskを使って非同期で帰ってきた结果です。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。