日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
項(xiàng)目中發(fā)現(xiàn)了一個(gè)新的玩意WebAsyncTask

[[403136]]

本文轉(zhuǎn)載自微信公眾號(hào)「六脈神劍的程序人生」,作者六脈神劍小六六。轉(zhuǎn)載本文請(qǐng)聯(lián)系六脈神劍的程序人生公眾號(hào)。

絮叨

剛好在讀項(xiàng)目代碼的時(shí)候,發(fā)現(xiàn)了WebAsyncTask這個(gè)新玩意,給大家來(lái)科普科普,不是那么的深入,不喜勿噴!

 

SpringBoot中同異步調(diào)用的使用

異步請(qǐng)求的處理。除了異步請(qǐng)求,一般上我們用的比較多的應(yīng)該是異步調(diào)用。通常在開(kāi)發(fā)過(guò)程中,會(huì)遇到一個(gè)方法是和實(shí)際業(yè)務(wù)無(wú)關(guān)的,沒(méi)有緊密性的。比如記錄日志信息等業(yè)務(wù)。這個(gè)時(shí)候正常就是啟一個(gè)新線(xiàn)程去做一些業(yè)務(wù)處理,讓主線(xiàn)程異步的執(zhí)行其他業(yè)務(wù)。

  • 同步請(qǐng)求

  • 異步請(qǐng)求

SprinBoot中@Async異步方法

異步的好處是,可以提高程序吞吐量,一個(gè)任務(wù),讓耗時(shí)的異步處理,并繼續(xù)同步處理后面的任務(wù),異步任務(wù)可以返回結(jié)果,拿到結(jié)果后可結(jié)合同步處理過(guò)程中的變量一起處理計(jì)算

具體的使用

在Spring中,基于@Async標(biāo)注的方法,稱(chēng)之為異步方法;這些方法將在執(zhí)行的時(shí)候,將會(huì)在獨(dú)立的線(xiàn)程中被執(zhí)行,調(diào)用者無(wú)需等待它的完成,即可繼續(xù)其他的操作。

自定義線(xiàn)程池異步調(diào)用

配置@EnableAsync使@Async生效

 
 
 
 
  1. @SpringBootApplication 
  2. @EnableAsync 
  3. public class Application { 
  4.   
  5.  public static void main(String[] args) { 
  6.   SpringApplication.run(Application.class, args); 
  7.  } 
  8.   

自定義線(xiàn)程池

 
 
 
 
  1. @Component 
  2. @Scope  //單例 
  3. public class MyExecutePoll { 
  4.   
  5.     @Bean 
  6.     public Executor myAsyncPool() { 
  7.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  8.         //核心線(xiàn)程池大小 
  9.         executor.setCorePoolSize(20); 
  10.         //最大線(xiàn)程數(shù) 
  11.         executor.setMaxPoolSize(40); 
  12.         //隊(duì)列容量 
  13.         executor.setQueueCapacity(50); 
  14.         // 活躍時(shí)間 
  15.         executor.setKeepAliveSeconds(300); 
  16.         // 線(xiàn)程名字前綴 
  17.         executor.setThreadNamePrefix("MyExecutor-"); 
  18.         //設(shè)置線(xiàn)程池關(guān)閉的時(shí)候等待所有任務(wù)都完成再繼續(xù)銷(xiāo)毀其他的Bean,使異步線(xiàn)程的銷(xiāo)毀優(yōu)先于Redis等其他處理報(bào)錯(cuò) 
  19.         executor.setWaitForTasksToCompleteOnShutdown(true); 
  20.         //設(shè)置線(xiàn)程池中任務(wù)的等待時(shí)間,如果超過(guò)這個(gè)時(shí)候還沒(méi)有銷(xiāo)毀就強(qiáng)制銷(xiāo)毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住 
  21.         executor.setAwaitTerminationSeconds(60); 
  22.         // setRejectedExecutionHandler:當(dāng)pool已經(jīng)達(dá)到max size的時(shí)候,如何處理新任務(wù) 
  23.         // CallerRunsPolicy:不在新線(xiàn)程中執(zhí)行任務(wù),而是由調(diào)用者所在的線(xiàn)程來(lái)執(zhí)行 
  24.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 
  25.         executor.initialize(); 
  26.         return executor; 
  27.     } 
  28.   

使用@Async

 
 
 
 
  1. @Async("myAsyncPool")   //@Async使用默認(rèn)的線(xiàn)程 
  2. public Future doTask() throws Exception { 
  3.     //業(yè)務(wù)處理   使用Future返回異步調(diào)用結(jié)果 
  4.     return new AsyncResult<>("任務(wù)一完成"); 

在Spring中運(yùn)用 Async注解 需要注意幾點(diǎn):

  • AsyncTest.java,測(cè)試類(lèi),調(diào)用異步任務(wù),同時(shí)執(zhí)行同步方法
  • OrderService.java,異步任務(wù)類(lèi),提供異步方法
  • AsyncThreadPoolConfig.java,異步任務(wù)線(xiàn)程池配置類(lèi),配置異步任務(wù)運(yùn)行的線(xiàn)程池大小等

基于Spring實(shí)現(xiàn)異步請(qǐng)求

Spring可以通過(guò)Callable或者WebAsyncTask等方式實(shí)現(xiàn)異步請(qǐng)求, 我們來(lái)看看,這2種實(shí)現(xiàn)方式!

Callable

Callable是為了異步生成返回值提供基本的支持。簡(jiǎn)單來(lái)說(shuō)就是一個(gè)請(qǐng)求進(jìn)來(lái),如果你使用了Callable,在沒(méi)有得到返回?cái)?shù)據(jù)之前,DispatcherServlet和所有Filter就會(huì)退出Servlet容器線(xiàn)程,但響應(yīng)保持打開(kāi)狀態(tài),一旦返回?cái)?shù)據(jù)有了,這個(gè)DispatcherServlet就會(huì)被再次調(diào)用并且處理,以異步產(chǎn)生的方式,向請(qǐng)求端返回值。這么做的好處就是請(qǐng)求不會(huì)長(zhǎng)時(shí)間占用服務(wù)連接池,提高服務(wù)器的吞吐量。

 
 
 
 
  1. @GetMapping("/callable") 
  2.     public Callable testCallable() throws InterruptedException { 
  3.         log.info("主線(xiàn)程開(kāi)始!"); 
  4.         Callable result = new Callable() { 
  5.  
  6.             @Override 
  7.             public String call() throws Exception { 
  8.                 log.info("副線(xiàn)程開(kāi)始!"); 
  9.                 Thread.sleep(1000); 
  10.                 log.info("副線(xiàn)程結(jié)束!"); 
  11.                 return "SUCCESS"; 
  12.             } 
  13.  
  14.         }; 
  15.         log.info("主線(xiàn)程結(jié)束!"); 
  16.         return result; 
  17.     } 

輸出結(jié)果

 
 
 
 
  1. 主線(xiàn)程開(kāi)始! 
  2.  
  3. 主線(xiàn)程結(jié)束! 
  4.  
  5. 副線(xiàn)程開(kāi)始! 
  6.  
  7. 副線(xiàn)程結(jié)束! 

WebAsyncTask

一個(gè)請(qǐng)求到服務(wù)上,是用的web容器的線(xiàn)程接收的

我們可以使用WebAsyncTask將這個(gè)請(qǐng)求分發(fā)給一個(gè)新的線(xiàn)程去執(zhí)行,容器的線(xiàn)程可以去接收其他請(qǐng)求的處理。一旦WebAsyncTask返回?cái)?shù)據(jù)有了,就會(huì)被再次調(diào)用并且處理,以異步產(chǎn)生的方式,向請(qǐng)求端返回值,但是其實(shí)我覺(jué)得前端的請(qǐng)求rt并不會(huì)說(shuō)變短。

 
 
 
 
  1. /** 
  2.     * 查詢(xún) 
  3.     */ 
  4.    @RequestMapping(method = RequestMethod.GET, value = "/aysncTask/{testId}") 
  5.    @ResponseStatus(HttpStatus.OK) 
  6.    public WebAsyncTask aysncTask(@PathVariable("testId") String testId) { 
  7.        System.out.println(String.format("/aysncTask/%s 被調(diào)用 thread id is: %s", testId,Thread.currentThread().getName())); 
  8.        Callable callable = () -> { 
  9.            Thread.sleep(1000L); 
  10.            Response response = new Response(true,"異步執(zhí)行成功"); 
  11.            System.out.println(String.format("/aysncTask/%s 被調(diào)用 thread id is: %s", testId,Thread.currentThread().getName())); 
  12.            return response; 
  13.        }; 
  14.        return new WebAsyncTask(callable); 
  15.    } 

控制臺(tái)打印如下:在執(zhí)行業(yè)務(wù)邏輯之前的線(xiàn)程和具體處理業(yè)務(wù)邏輯的線(xiàn)程不是同一個(gè),達(dá)到了我們的目的。async-customize-1這個(gè)前綴是我們自定義的下邊會(huì)說(shuō)

 
 
 
 
  1. /aysncTask/12348567676 被調(diào)用 thread id is: http-nio-8084-exec-1 
  2. /aysncTask/12348567676 被調(diào)用 thread id is: async-customize-1 

其實(shí)WebAsyncTask比起Callable是有以下幾個(gè)優(yōu)點(diǎn)的

官方有這么一句話(huà),截圖給你:

如果我們需要超時(shí)處理的回調(diào)或者錯(cuò)誤處理的回調(diào),我們可以使用WebAsyncTask代替Callable

實(shí)際使用中,我并不建議直接使用Callable ,而是使用Spring提供的WebAsyncTask 代替,它包裝了Callable,功能更強(qiáng)大些

總結(jié)

 

其實(shí)本文就是給大家科普下,一些異步的用法,不至于說(shuō)看到人家這么用很蒙b,多線(xiàn)程的東西還是優(yōu)點(diǎn)東西的,大家一起學(xué)習(xí)。


本文標(biāo)題:項(xiàng)目中發(fā)現(xiàn)了一個(gè)新的玩意WebAsyncTask
網(wǎng)頁(yè)URL:http://www.5511xx.com/article/cojspds.html