Di Spring Boot (Spring MVC), permintaan disinkronkan secara default. Sebuah utas bertanggung jawab untuk masa lalu dan akhir dari permintaan. Dalam banyak kasus, untuk meningkatkan throughput, beberapa operasi perlu disinkronkan. Selain beberapa logika bisnis yang memakan waktu yang dapat disinkronkan, antarmuka kueri kami juga dapat dieksekusi secara tidak sinkron.
Permintaan ke Layanan diterima oleh utas dari wadah web, seperti utas HTTP-NIO-8084-Exec-1
Kami dapat menggunakan WebAsynctask untuk mendistribusikan permintaan ini ke utas baru untuk dieksekusi, dan HTTP-NIO-8084-Exec-1 dapat menerima pemrosesan permintaan lainnya. Setelah WebAsynctask mengembalikan data, itu akan dipanggil dan diproses lagi, dan nilainya akan dikembalikan ke sisi yang diminta dengan cara yang tidak sinkron.
Kode sampel adalah sebagai berikut:
@ReQuestMapping (value = "/login", Method = requestMethod.get) public WebAsynctask <ModelAndView> longTimetask () {System.out.println ("/Login disebut id thread adalah:" + thread.currentthread (). GetName ()); Callable <ModelAndView> callable = new Callable <modelandview> () {public ModelAndView call () melempar Exception {thread.sleep (1000); /Simulasikan tugas jangka panjang model danview mav = new ModelAndView ("Login/Index"); System.out.println ("Eksekusi ID utas yang berhasil adalah:" + thread.currentThread (). GetName ()); mengembalikan mav; }}; Return New WebAsynctask <PodelingAndView> (Callable);}Anda dapat melihat hasil output sebagai berikut:
/Login disebut ID utas adalah: http-nio-8084-exec-1
Eksekusi berhasil ID utas adalah: mvcasync1
Utas sebelum menjalankan logika bisnis dan utas yang secara khusus berkaitan dengan logika bisnis tidak sama, yang mencapai tujuan kami.
Kemudian saya melakukan tes bersamaan dan menemukan bahwa saya terus -menerus membuat utas MVCASYNC1. Saya berpikir, bukankah kumpulan utas digunakan?
Setelah membaca kode sumber, saya menemukan bahwa ini benar. WebAsyncManager adalah kelas pusat untuk Spring MVC untuk mengelola pemrosesan async.
Standarnya adalah menggunakan SimpleAsyncTaskexecutor, yang akan membuat utas baru untuk setiap permintaan.
Asynctaskexecutor pribadi TaskExecutor = new SimpleAsyncTaskexecutor (this.getClass (). getsImplename ());
Jika tugas menentukan pelaksana, gunakan tugas menentukannya. Jika tidak, gunakan default smelleasynctaskexecutor
Asynctaskexecutor executor = webasynctask.getExecutor (); if (executor! = Null) {this.taskexecutor = executor;}Kami dapat mengonfigurasi kumpulan utas async tanpa menentukannya secara terpisah untuk setiap tugas
Tentukan oleh configurer.setaskexecutor (threadpooltaskexecutor ());
impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.onfigurasi; impor org.springframework.scheduling.concurrent.threadpooltaskexecutor; impor org.springframework.web.context.request.async.timeoutcallableProcessingInterceptor; impor org.springframework.web.servlet.config.annotation.asyncsupportConfigurer; impor org.springframework.web.servlet.config.annotation.webmvccconfigurationsupport; @configurationPublic Class Public WebMvCconfig memperluas WebMvCcConfigurationsupport {@Override void configureAsyncsupport (final AsynCupport (@Override public configureAsyncsupport (final asyncupport {@Override public configureAsyncsupport (final AsynCupturePort (@Override public. configurer.RegisterCallableinterCeptors (timeoutInterceptor ()); configurer.settaskexecutor (threadpooltaskexecutor ()); } @Bean Public TimeOutCallablePressingInterceptor TimeoutInterceptor () {return new timeoutCallableProcessingInterceptor (); } @Bean ThreadpooltaskExecutor ThreadPooltaskExecutor () {threadpooltaskexecutor t = new ThreadPooltaskexecutor (); t.setCorepoolSize (10); T.SetMaxPoolSize (50); t.setThreadnameprefix ("yjh"); mengembalikan t; }}Setelah konfigurasi, Anda dapat melihat bahwa nama utas output dimulai dengan YJH, dan utas baru tidak akan dibuat sepanjang waktu.
Anda dapat melihat hasil output sebagai berikut:
/Login disebut ID utas adalah: http-nio-8084-exec-1 eksekusi berhasil ID utas adalah: yjh1
Meringkaskan
Di atas adalah apa yang diperkenalkan editor ke Spring Boot menggunakan WebAsynctask untuk mengembalikan hasil secara tidak sinkron. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!