成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

項目中發現了一個新的玩意WebAsyncTask

開發 項目管理
異步請求的處理。除了異步請求,一般上我們用的比較多的應該是異步調用。通常在開發過程中,會遇到一個方法是和實際業務無關的,沒有緊密性的。比如記錄日志信息等業務。

[[403136]]

本文轉載自微信公眾號「六脈神劍的程序人生」,作者六脈神劍小六六。轉載本文請聯系六脈神劍的程序人生公眾號。

絮叨

剛好在讀項目代碼的時候,發現了WebAsyncTask這個新玩意,給大家來科普科普,不是那么的深入,不喜勿噴!

 

SpringBoot中同異步調用的使用

異步請求的處理。除了異步請求,一般上我們用的比較多的應該是異步調用。通常在開發過程中,會遇到一個方法是和實際業務無關的,沒有緊密性的。比如記錄日志信息等業務。這個時候正常就是啟一個新線程去做一些業務處理,讓主線程異步的執行其他業務。

  • 同步請求

  • 異步請求

SprinBoot中@Async異步方法

異步的好處是,可以提高程序吞吐量,一個任務,讓耗時的異步處理,并繼續同步處理后面的任務,異步任務可以返回結果,拿到結果后可結合同步處理過程中的變量一起處理計算

具體的使用

在Spring中,基于@Async標注的方法,稱之為異步方法;這些方法將在執行的時候,將會在獨立的線程中被執行,調用者無需等待它的完成,即可繼續其他的操作。

自定義線程池異步調用

配置@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.   

自定義線程池

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

使用@Async

  1. @Async("myAsyncPool")   //@Async使用默認的線程 
  2. public Future<String> doTask() throws Exception { 
  3.     //業務處理   使用Future返回異步調用結果 
  4.     return new AsyncResult<>("任務一完成"); 

在Spring中運用 Async注解 需要注意幾點:

  • AsyncTest.java,測試類,調用異步任務,同時執行同步方法
  • OrderService.java,異步任務類,提供異步方法
  • AsyncThreadPoolConfig.java,異步任務線程池配置類,配置異步任務運行的線程池大小等

基于Spring實現異步請求

Spring可以通過Callable或者WebAsyncTask等方式實現異步請求, 我們來看看,這2種實現方式!

Callable

Callable是為了異步生成返回值提供基本的支持。簡單來說就是一個請求進來,如果你使用了Callable,在沒有得到返回數據之前,DispatcherServlet和所有Filter就會退出Servlet容器線程,但響應保持打開狀態,一旦返回數據有了,這個DispatcherServlet就會被再次調用并且處理,以異步產生的方式,向請求端返回值。這么做的好處就是請求不會長時間占用服務連接池,提高服務器的吞吐量。

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

輸出結果

  1. 主線程開始! 
  2.  
  3. 主線程結束! 
  4.  
  5. 副線程開始! 
  6.  
  7. 副線程結束! 

WebAsyncTask

一個請求到服務上,是用的web容器的線程接收的

我們可以使用WebAsyncTask將這個請求分發給一個新的線程去執行,容器的線程可以去接收其他請求的處理。一旦WebAsyncTask返回數據有了,就會被再次調用并且處理,以異步產生的方式,向請求端返回值,但是其實我覺得前端的請求rt并不會說變短。

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

控制臺打印如下:在執行業務邏輯之前的線程和具體處理業務邏輯的線程不是同一個,達到了我們的目的。async-customize-1這個前綴是我們自定義的下邊會說

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

其實WebAsyncTask比起Callable是有以下幾個優點的

官方有這么一句話,截圖給你:

如果我們需要超時處理的回調或者錯誤處理的回調,我們可以使用WebAsyncTask代替Callable

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

總結

 

其實本文就是給大家科普下,一些異步的用法,不至于說看到人家這么用很蒙b,多線程的東西還是優點東西的,大家一起學習。

 

責任編輯:武曉燕 來源: 六脈神劍的程序人生
相關推薦

2021-06-17 10:01:54

APT活動Victory 后門惡意軟件

2021-01-26 11:16:12

漏洞網絡安全網絡攻擊

2022-04-28 09:41:29

Linux 操作系統漏洞Microsoft

2021-10-29 11:45:26

Python代碼Python 3.

2025-06-18 08:16:26

2025-05-19 10:04:48

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2023-02-26 01:02:22

2021-12-29 19:20:41

數據GitHub服務器

2021-06-09 14:45:50

安全漏洞攻擊漏洞

2021-06-09 18:59:48

AI

2021-03-06 13:31:52

網絡釣魚惡意郵件攻擊

2024-05-20 08:25:55

2020-06-09 08:05:11

Android 代碼操作系統

2019-01-14 11:10:43

機器學習人工智能計算機

2023-05-17 00:22:15

2021-03-08 10:58:03

漏洞Microsoft E微軟

2021-04-28 14:31:35

Dubbo接口日志

2020-06-16 08:39:35

JavaScript圖像處理庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 蜜桃视频在线观看免费视频网站www | 日韩www | 成人黄色av网站 | 日韩欧美中文字幕在线视频 | 亚洲欧美在线观看 | 日韩精品视频在线 | 狠狠操电影 | 国产一区二区免费 | 亚洲一二三在线 | 日韩精品一区二区三区视频播放 | 精品亚洲永久免费精品 | 亚洲一区久久 | www.国产一区| 99色综合 | caoporn免费| 精品免费视频一区二区 | 国户精品久久久久久久久久久不卡 | 欧美日韩精品一区二区三区四区 | 黑人性hd| 国产情侣激情 | 成人精品国产免费网站 | 国产精品视频在线观看 | 视频一区欧美 | 日韩中文一区二区 | 亚洲一区 | 国产重口老太伦 | 在线免费观看黄色 | 在线免费观看黄a | 国产精品99久久久久久动医院 | 一区二区三区欧美 | 亚洲欧美成人在线 | 欧美一区二区三区在线视频 | 99热精品在线观看 | 久久久噜噜噜久久中文字幕色伊伊 | 男人的天堂一级片 | 欧美一级一区 | 欧美一区二区三区在线免费观看 | 91一区二区 | 美女久久| 亚洲欧美精品 | 国产成人综合亚洲欧美94在线 |