精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊 Spring 異步任務教程

開發 前端
阿粉最近碰到一個場景,用戶注冊之后需要發送郵件給其郵箱。原先設計中,這是一個同步過程,注冊方法需要等待郵件發送成功才能返回。

 阿粉最近碰到一個場景,用戶注冊之后需要發送郵件給其郵箱。原先設計中,這是一個同步過程,注冊方法需要等待郵件發送成功才能返回。

[[331996]]

由于郵件發送流程對于注冊來說并不是一個關鍵節點,我們可以將郵件發送異步執行,減少注冊方法執行時間。

我們可以自己創建線程池,然后執行異步任務,示例代碼如下:

  1. // 生產使用線程池的最佳實踐,一定要自定義線程池,不要嫌麻煩,使用 Executors 創建線程池 
  2. private ThreadPoolExecutor threadPool = 
  3.         new ThreadPoolExecutor(5, 
  4.                 10, 
  5.                 60l, 
  6.                 TimeUnit.SECONDS, 
  7.                 new LinkedBlockingDeque<>(200), 
  8.                 new ThreadFactoryBuilder().setNameFormat("register-%d").build()); 
  9.  
  10. /** 
  11.  * 使用線程池執行發送郵件的任務 
  12.  */ 
  13. private void sendEmailByThreadPool() { 
  14.     threadPool.submit(() -> emailService.sendEmail()); 

ps: 生產使用線程池的最佳實踐,一定要自定義線程池,根據業務場景設置合理的線程池參數,另外給線程設置具有明確意義的前綴,這樣排查問題就非常簡單。

千萬不要為了方便,使用 Executors 相關方法創建線程池。

上面代碼中使用線程池完成了發送郵件的異步任務,可以看到這個示例還是有點麻煩,我們不僅要自定義線程池,還需要在創建相關任務執行類。

Spring 提供執行異步任務功能,我們使用一個注解就可以輕松完成上面的功能。

今天阿粉就來講解一下如何使用 Spring 異步任務,以及 Spring 異步任務使用過程中一些注意點。

異步任務使用方式

Spring 異步任務需要在相關的方法上設置 @Async 注解,這里為了舉例,我們創建一個 EmailService 類,專用完成郵件服務。

代碼如下所示:

  1. @Slf4j 
  2. @Service 
  3. public class EmailService { 
  4.  
  5.     /** 
  6.      * 異步發送任務 
  7.      * 
  8.      * @throws InterruptedException 
  9.      */ 
  10.     @SneakyThrows 
  11.     @Async 
  12.     public void sendEmailAsync() { 
  13.         log.info("使用 Spring 異步任務發送郵件示例"); 
  14.         // 模擬郵件發送耗時 
  15.         TimeUnit.SECONDS.sleep(2l); 
  16.     } 

這里要注意了,Spring 異步任務默認關閉的,我們需要使用 @EnableAsync開啟異步任務。

如果還在使用 Spring XML 配置,我們需要配置如下配置:

  1. <task:annotation-driven/> 

上述配置完成之后,我們只需要在調用方,比如上一層 Controller 注入這個 EmailService ,然后直接調用這個方法,該方法將會在異步線程中執行。

  1. @Slf4j 
  2. @RestController 
  3. public class RegisterController { 
  4.  
  5.     @Autowired 
  6.     EmailService emailService; 
  7.  
  8.     @RequestMapping("register"
  9.     public String register() { 
  10.      log.info("注冊流程開始"); 
  11.      emailService.sendEmailAsync(); 
  12.         return "success"
  13.     } 
  14.  } 

輸出日志如下:

從日志上可以看到,兩個方法執行線程不一樣,這就說明了EmailService#sendEmailAsync 被異步線程成功執行。

帶有返回值的異步任務

上面的異步任務比較簡單,但是有時我們有需要獲取異步任務返回值。

如果使用線程池執行異步任務,我們可以使用 threadPool#submit 獲取返回對象 Future,接著我們就可以調用其內 get 方法,獲取返回結果。

在 Spring 異步任務中,我們也可以使用 Future 獲取返回結果,示例代碼如下:

  1. @Async 
  2. @SneakyThrows 
  3. public Future<String> sendEmailAsyncWithResult() { 
  4.     log.info("使用 Spring 異步任務發送郵件,并且獲取任務返回結果示例"); 
  5.     TimeUnit.SECONDS.sleep(2l); 
  6.     return AsyncResult.forValue("success"); 

這里需要注意,這里返回對象我們需要使用 Spring 內部類 AsyncResult。

Controller 層調用代碼如下所示:

  1.  private void sendEmailWithResult() { 
  2.         Future<String> future = emailService.sendEmailAsyncWithResult(); 
  3.         try { 
  4.             String result = future.get(); 
  5.         } catch (InterruptedException e) { 
  6.             e.printStackTrace(); 
  7.         } catch (ExecutionException e) { 
  8.             e.printStackTrace(); 
  9.         } 
  10.  
  11.     } 

我們知道 Future#get 方法將會一直阻塞,直到異步任務執行成功。

有時候我們獲取異步任務的返回值是為了做一下后續業務,但是主流程方法是無需返回異步任務的返回值。如果我們使用了 Future#get方法,主流程就會一直被阻塞。

對于這種場景,我們可以使用 org.springframework.util.concurrent.ListenableFuture稍微改造一下上面的方法。

ListenableFuture 這個類允許我們注冊回調函數,一旦異步任務執行成功,或者執行異常,將會立刻執行回調函數。通過這種方式就可以不用阻塞執行的主線程。

示例代碼如下:

  1. @Async 
  2. @SneakyThrows 
  3. public ListenableFuture<String> sendEmailAsyncWithListenableFuture() { 
  4.     log.info("使用 Spring 異步任務發送郵件,并且獲取任務返回結果示例"); 
  5.     TimeUnit.SECONDS.sleep(2l); 
  6.     return AsyncResult.forValue("success"); 

Controller 層代碼如下所示:

  1. ListenableFuture<String> listenableFuture = emailService.sendEmailAsyncWithListenableFuture(); 
  2. // 異步回調處理 
  3. listenableFuture.addCallback(new SuccessCallback<String>() { 
  4.     @Override 
  5.     public void onSuccess(String result) { 
  6.         log.info("異步回調處理返回值"); 
  7.  
  8.     } 
  9. }, new FailureCallback() { 
  10.     @Override 
  11.     public void onFailure(Throwable ex) { 
  12.         log.error("異步回調處理異常",ex); 
  13.     } 
  14. }); 

看到這里,如果有同學有疑惑,我們返回對象是 AsyncResult,為什么方法返回類可以是 Future,又可以是 ListenableFuture?

看完這張類繼承關系,大家應該就知道答案了。

異常處理方式

異步任務中異常處理方式,不是很難,我們只要在方法中將整個代碼塊 try...catch 即可。

  1. try { 
  2.  // 其他代碼 
  3. } catch (Exception e) { 
  4.     e.printStackTrace(); 

一般來說,我們只需要捕獲 Exception 異常,就可以應對大部分情況

但是極端情況下,比如方法內發生 OOM,將會拋出 OutOfMemoryError。如果發生Error 錯誤,以上的捕獲代碼就會失效。

Spring 的異步任務,默認提供幾種異常處理方式,可以統一處理異步任務中的發生的異常。

帶有返回值的異常處理方式

如果我們使用帶有返回值的異步任務,處理方式就比較簡單了,我們只需要捕獲 Future#get 拋出的異常就好了。

  1. Future<String> future = emailService.sendEmailAsyncWithResult(); 
  2. try { 
  3.     String result = future.get(); 
  4. } catch (InterruptedException e) { 
  5.     e.printStackTrace(); 
  6. } catch (ExecutionException e) { 
  7.     e.printStackTrace(); 

如果我們使用 ListenableFuture 注冊回調函數處理,那我們在方法內增加一個 FailureCallback,在這個實現類處理相關異常即可。

  1. ListenableFuture<String> listenableFuture = emailService.sendEmailAsyncWithListenableFuture(); 
  2. // 異步回調處理 
  3. listenableFuture.addCallback(new SuccessCallback<String>() { 
  4.     @Override 
  5.     public void onSuccess(String result) { 
  6.         log.info("異步回調處理返回值"); 
  7.  
  8.     } 
  9.     // 異常處理 
  10. }, new FailureCallback() { 
  11.     @Override 
  12.     public void onFailure(Throwable ex) { 
  13.         log.error("異步回調處理異常",ex); 
  14.     } 
  15. }); 

統一異常處理方式

沒有返回值的異步任務處理方式就比較復雜了,我們需要繼承 AsyncConfigurerSupport,實現 getAsyncUncaughtExceptionHandler 方法,示例代碼如下:

  1. @Slf4j 
  2. @Configuration 
  3. public class AsyncErrorHandler extends AsyncConfigurerSupport { 
  4.  
  5.     @Override 
  6.     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
  7.         AsyncUncaughtExceptionHandler handler = (throwable, method, objects) -> { 
  8.             log.error("全局異常捕獲", throwable); 
  9.         }; 
  10.         return handler; 
  11.     } 
  12.  

ps:這個異常處理方式只能處理未帶返回值的異步任務。

異步任務使用注意點

異步線程池設置

Spring 異步任務默認使用 Spring 內部線程池 SimpleAsyncTaskExecutor 。

這個線程池比較坑爹,不會復用線程。也就是說來一個請求,將會新建一個線程。極端情況下,如果調用次數過多,將會創建大量線程。

Java 中的線程是會占用一定的內存空間 ,所以創建大量的線程將會導致 OOM 錯誤。

所以如果需要使用異步任務,我們需要一定要使用自定義線程池替換默認線程池。

XML 配置方式

如果當前使用 Spring XML 配置方式,我們可以使用如下配置設置線程池:

  1. <task:annotation-driven/> 
  2. <task:executor id="executor" pool-size="10" queue-capacity="200"/> 

注解方式

如果注解方式配置,配置方式如下:

  1. @Configuration 
  2. public class AsyncConfiguration { 
  3.  
  4.  
  5.     @Bean 
  6.     public ThreadPoolTaskExecutor taskExecutor() { 
  7.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
  8.         executor.setThreadNamePrefix("task-Executor-"); 
  9.         executor.setMaxPoolSize(10); 
  10.         executor.setCorePoolSize(5); 
  11.         executor.setQueueCapacity(200); 
  12.         // 還有其他參數可以設置 
  13.         return executor; 
  14.     } 

只要我們配置了這個線程池Bean,Spring 的異步任務都將會使用該線程池執行。

如果我們應用配置了多個線程池Bean,異步任務需要指定使用某個線程池執行,我們只需要在 @Async注解上設置相應 Bean 的名字即可。示例代碼如下:

  1. @Async("taskExecutor"
  2. public void sendEmailAsync() { 
  3.     log.info("使用 Spring 異步任務發送郵件示例"); 
  4.     TimeUnit.SECONDS.sleep(2l); 

Spring Boot 方式

如果是 SpringBoot 項目,從阿粉的測試情況來看,默認將會創建核心線程數為 8,最大線程數為 Integer.MAX_VALUE,隊列數也為 Integer.MAX_VALUE線程池。

雖然上面的線程池不用擔心創建過多線程的問題,不是還是有可能隊列任務過多,導致 OOM 的問題。所以還是建議使用自定義線程池嗎,或者在配置文件修改默認配置,例如:

  1. spring.task.execution.pool.core-size=10 
  2. spring.task.execution.pool.max-size=20 
  3. spring.task.execution.pool.queue-capacity=200 

ps:如果我們使用注解方式自定義了一個線程池,那么 Spring 異步任務都將會使用這個線程池。通過 SpringBoot 配置文件創建的線程池將會失效。

異步方法失效

Spring 異步任務背后原理是使用 AOP ,而使用 Spring AOP 時我們需要注意,切勿在方法內部調用其他使用 AOP 的方法,可能有點拗口,我們來看下代碼:

  1. @Async 
  2. @SneakyThrows 
  3. public ListenableFuture<String> sendEmailAsyncWithListenableFuture() { 
  4.     // 這樣調用,sendEmailAsync 不會異步執行 
  5.     sendEmailAsync(); 
  6.     log.info("使用 Spring 異步任務發送郵件,并且獲取任務返回結果示例"); 
  7.     TimeUnit.SECONDS.sleep(2l); 
  8.     return AsyncResult.forValue("success"); 
  9.  
  10. /** 
  11.      * 異步發送任務 
  12.      * 
  13.      * @throws InterruptedException 
  14.      */ 
  15. @SneakyThrows 
  16. @Async("taskExecutor"
  17. public void sendEmailAsync() { 
  18.     log.info("使用 Spring 異步任務發送郵件示例"); 
  19.     TimeUnit.SECONDS.sleep(2l); 

上面兩個方法都處于同一個類中,這樣調用將會導致 AOP 失效,無法起到 AOP 的效果。

其他類似的 @Transactional,以及自定義的 AOP 注解都會有這個問題,大家使用過程,千萬需要注意這一點。

總結

Spring 異步任務幫我們大大解決簡化開發了流程,只要使用一個@Async就可以輕松解決異步任務。

不過,雖然使用方式比較簡單,大家使用過程一定要注意設置合理的線程池。

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-07-31 08:05:30

Spring任務調度

2021-06-02 09:01:19

JavaScript 前端異步編程

2021-06-28 14:13:35

Jenkins服務器程序

2024-01-31 08:41:43

異步設計項目

2024-10-23 08:13:30

Spring響應式編程

2023-04-28 08:43:46

2021-06-04 08:48:46

Spring ClouMaven Centr版本

2024-05-23 11:26:02

2025-10-09 07:47:04

2024-04-02 08:27:19

異步任務抽象

2022-06-02 10:18:24

函數計算異步

2023-01-03 10:38:04

函數計算技術

2016-11-28 09:08:43

java系統異步非阻塞

2022-07-01 08:00:44

異步編程FutureTask

2021-10-28 19:28:04

數據庫開發Spring

2021-03-08 00:11:02

Spring注解開發

2024-10-14 13:12:59

2014-04-24 09:49:57

Android測試異步任務

2023-11-03 14:32:38

2024-03-13 14:35:33

Spring事件異步
點贊
收藏

51CTO技術棧公眾號

黄色香蕉视频在线观看| 97免费视频观看| 影音先锋国产资源| 欧美黄污视频| 日韩禁在线播放| 亚洲高清在线免费观看| 91极品在线| 久久午夜免费电影| 91理论片午午论夜理片久久| 日韩aaaaaa| 成人影院在线| 亚洲国产日韩欧美在线99| 九色porny91| 日皮视频在线观看| 国产女人aaa级久久久级| 91久色国产| 男操女视频网站| 欧美日韩精品一本二本三本| 国产午夜精品一区二区三区 | 美女尤物国产一区| 久久久久日韩精品久久久男男| 日本理论中文字幕| 美国一区二区| 日韩一级片在线观看| 手机看片福利盒子久久| 日本在线视频网址| 中文字幕在线不卡视频| 麻豆成人在线播放| 亚洲男人第一天堂| 韩国欧美一区二区| 国产精品美女久久久久久免费| 国产手机在线视频| 欧美激情视频一区二区三区免费| 色av中文字幕一区| 男人的天堂官网| 蜜乳av综合| 日韩电影中文字幕在线| 波多野结衣办公室双飞 | 精品国产一区二区三区麻豆小说| 国产又粗又猛又爽又黄的视频一| 狂野欧美性猛交xxxx巴西| 欧美激情视频三区| 免费在线观看黄色av| 亚洲精品中文字幕乱码| 日韩色av导航| 日韩av片在线免费观看| 欧洲乱码伦视频免费| 亚洲乱码一区二区| 成人片黄网站色大片免费毛片| 福利在线一区| 亚洲护士老师的毛茸茸最新章节| 女教师高潮黄又色视频| 日韩欧美激情电影| 欧美成人video| 曰本三级日本三级日本三级| 视频精品一区二区三区| 日韩视频一区二区三区在线播放 | 国产精品美女久久久久| 欧美丰满嫩嫩电影| 制服下的诱惑暮生| 岛国精品一区| 精品调教chinesegay| 成人免费无码大片a毛片| 欧洲在线一区| 国产亚洲a∨片在线观看| 亚洲色图欧美色| 天天操综合网| 久久久久久久一区二区三区| 久久国产精品系列| 丝瓜av网站精品一区二区| 国产成人亚洲综合91精品| 少妇无套内谢久久久久| 精品一区二区在线看| 51国偷自产一区二区三区的来源| 亚洲欧美激情在线观看| 99久久免费精品| 欧美在线视频二区| 免费网站黄在线观看| 一区二区三区欧美日韩| 美女av免费在线观看| 亚洲四虎影院| 日韩小视频在线观看专区| 亚洲av成人精品一区二区三区 | 国产在线视频二区| 豆花视频一区二区| 日韩精品亚洲视频| 免费看91的网站| 国产精品久久久乱弄| 欧美第一黄网免费网站| 亚洲精品男人的天堂| 久久精品国产99| av一本久道久久波多野结衣| 无码精品视频一区二区三区 | 高清一区二区三区视频| 日韩成人黄色| 国产精品国产自产拍高清av王其| 欧妇女乱妇女乱视频| 欧美日韩免费看片| 欧美一区二区视频在线观看| 久久一区二区电影| 国产精品二区不卡| 51ⅴ精品国产91久久久久久| 亚洲一卡二卡在线观看| www.亚洲激情.com| 中国成人亚色综合网站| 91久久国产综合久久91猫猫| 欧美一区二区三区在线观看 | 亚洲欧美日韩一区| 国产精品无码专区av在线播放| 99久久99九九99九九九| 亚洲摸下面视频| 久久婷婷一区二区| 经典一区二区三区| 秋霞毛片久久久久久久久| 牛牛电影国产一区二区| 欧美老肥妇做.爰bbww| 中文字幕免费高清视频| 亚洲中无吗在线| 国产精品老女人视频| 午夜性色福利视频| 一区二区三区四区在线播放 | 国产精品极品| 欧美成人四级hd版| 一级黄色片在线看| 日本一区二区三区四区在线视频| 免费看国产一级片| 99热这里只有精品首页| 久久亚洲精品视频| 亚洲天堂2021av| 久久久国产一区二区三区四区小说| 亚洲 欧美 综合 另类 中字| 国产精品高清一区二区| 精品激情国产视频| 中文字幕制服诱惑| 中文欧美字幕免费| 免费一级特黄录像| 欧美精品一区二区三区精品| 日本欧美中文字幕| 外国精品视频在线观看| 天天综合网 天天综合色| 99久久久无码国产精品性波多 | 欧美大片在线影院| 精品人妻伦一二三区久久| 亚洲视频一区二区在线| 精品综合久久久久| 91精品久久久久久久蜜月| 成人黄色网免费| 麻豆视频免费在线观看| 91麻豆精品国产自产在线| 国产精品精品软件男同| 久久99日本精品| 中文字幕一区二区三区最新 | av资源在线| 亚洲激情视频网| 国产情侣在线视频| 91看片淫黄大片一级| 免费午夜视频在线观看| 精品99久久| 国产精品男人爽免费视频1| av在线天堂播放| 欧美精品日韩精品| 久久人人爽人人爽人人| 91天堂素人约啪| 日韩一级片播放| 久久精品一区二区不卡| 99一区二区三区| 免费v片在线观看| 亚洲天堂精品在线| 亚洲一区二区三区高清视频| 亚洲精品欧美二区三区中文字幕| 天天看片天天操| 午夜视频精品| 欧美一区二区综合| 亚洲一区导航| 午夜精品久久久久久久白皮肤| 无码国产精品一区二区色情男同| 色欧美乱欧美15图片| 国产精品久久久免费看| 国产成人在线影院| 99福利在线观看| 四虎成人精品永久免费av九九| 91夜夜揉人人捏人人添红杏| 678在线观看视频| 亚洲无线码在线一区观看| 国产美女主播在线观看| 欧美日韩另类在线| 久久人妻无码aⅴ毛片a片app| 丰满亚洲少妇av| 午夜dv内射一区二区| 欧美女人交a| 日韩成人在线资源| 亚洲小说春色综合另类电影| 日本国产欧美一区二区三区| 国产原创精品视频| 亚洲开心激情网| 国内精品国产成人国产三级| 色噜噜狠狠色综合中国| 69av视频在线| 欧美精彩视频一区二区三区| www.555国产精品免费| 蜜臀av性久久久久蜜臀aⅴ流畅| 97超碰国产精品| 久久国产精品成人免费观看的软件| 国产精品视频在线免费观看| 欧美大陆国产| 热久久视久久精品18亚洲精品| 97超碰资源站在线观看| 最新国产精品拍自在线播放| 亚洲日本香蕉视频| 日韩欧美自拍偷拍| 在线视频播放大全| 91国产福利在线| 国产成人无码精品久久久久| 亚洲视频精选在线| 在线观看免费小视频| 91免费观看视频| 亚洲一区二区三区四区av| 激情六月婷婷综合| 无码日韩人妻精品久久蜜桃| 一区二区日本视频| 三上悠亚久久精品| 好吊一区二区三区| 国产成人免费高清视频| 日韩欧美高清在线播放| 日韩av电影在线观看| 视频福利一区| 蜜桃麻豆www久久国产精品| 中文字幕av一区二区三区四区| 91麻豆国产精品| 久久影视精品| 国产精品视频久久| 亚洲电影有码| 国产精品大陆在线观看| 一本大道色婷婷在线| 97婷婷大伊香蕉精品视频| 国产盗摄在线视频网站| 国a精品视频大全| 蜜桃成人365av| 欧美精品videos| 国内老司机av在线| 欧美激情奇米色| 国产一线二线在线观看| 欧美激情精品久久久| 久草在线视频资源| 久久久噜久噜久久综合| 都市激情久久综合| 性欧美xxxx交| 国产在线精彩视频| 欧美有码在线观看视频| 中国字幕a在线看韩国电影| 日本a级片电影一区二区| 亚洲天堂av影院| 国产成人亚洲综合91| 免费在线观看一区| 国产精品久久婷婷六月丁香| 视频欧美精品| 亚洲最大成人在线| 成人在线tv视频| 久久99精品久久久久久三级| 亚洲黄页网站| 亚洲欧美成人一区| 一区二区影院| 国产中文字幕二区| 日韩国产精品91| 国产毛片久久久久久| 风流少妇一区二区| 色噜噜日韩精品欧美一区二区| 国产日韩欧美激情| 中文字幕在线2021| 午夜精品aaa| 高潮毛片又色又爽免费 | 国产精品久久久久久久久久新婚| 精品乱码一区二区三区四区| 亚洲va电影大全| 欧洲亚洲视频| 一区二区在线高清视频| 黄色成人av网站| 黄色片久久久久| 激情综合亚洲精品| 国产真实乱人偷精品| 亚洲国产精品黑人久久久| 亚洲熟女www一区二区三区| 天天综合天天综合色| 亚洲天堂自拍偷拍| 精品国产免费视频| 成全电影播放在线观看国语| 色综合视频网站| 欧美日韩精品免费观看视欧美高清免费大片 | 污视频在线免费观看一区二区三区 | 日韩三区免费| 超碰97在线资源| 国产成人精品999在线观看| 永久免费网站视频在线观看| 国产日韩欧美一区在线| 中文字幕免费高清在线| 91视频国产资源| 日韩欧美综合视频| 色素色在线综合| 亚洲h视频在线观看| 一区二区福利视频| 九色porny视频在线观看| 国产日韩欧美日韩大片| 香蕉视频一区| 欧美高清中文字幕| 精品综合久久久久久8888| 国产偷人妻精品一区| 亚洲欧美激情在线| 69亚洲精品久久久蜜桃小说| 精品国产一二三| 免费黄色网址在线观看| 日韩av免费看网站| 久久男人av| 欧美a级免费视频| 久久99国内精品| 日本性高潮视频| 疯狂做受xxxx高潮欧美日本| 性做久久久久久久久久| 日韩亚洲在线观看| 99久久精品一区二区成人| 久久久久一区二区| 在线视频观看日韩| 日本女人黄色片| 1000精品久久久久久久久| 成人黄色免费网| 一本一道久久a久久精品逆3p| 欧美一级鲁丝片| 国产一区喷水| 国产在线成人| 亚洲精品一区二区18漫画| 亚洲欧美自拍偷拍| 亚洲一区 中文字幕| 中文字幕亚洲二区| 国产精品亚洲成在人线| 四虎影院一区二区三区| 日韩电影在线免费观看| 亚洲熟妇一区二区三区| 色综合久久久久| 欧美成人综合在线| 日韩av成人在线观看| 九热爱视频精品视频| 国产一区亚洲二区三区| 91蝌蚪porny| 99久久久无码国产精品免费蜜柚| 精品视频—区二区三区免费| 久久uomeier| 人偷久久久久久久偷女厕| 久久综合九色| 性の欲びの女javhd| 欧美日韩色一区| 毛片网站在线免费观看| 亚洲中国色老太| 欧美在线国产| 中国黄色片视频| 日韩欧美在线视频日韩欧美在线视频 | 久久69国产一区二区蜜臀| frxxee中国xxx麻豆hd| 欧美一区二区在线不卡| 国产第一页在线| 狼狼综合久久久久综合网| 丝袜美腿亚洲一区| 波兰性xxxxx极品hd| 欧美一级欧美三级| www555久久| 欧美另类高清视频在线| 青青草成人在线观看| 成人免费精品动漫网站| 日韩精品一区二区三区swag| 久草在线资源站手机版| 四虎一区二区| 国产91丝袜在线播放| 国产成人精品片| 色天天综合狠狠色| 999久久久精品一区二区| 国产精品亚洲αv天堂无码| 中文字幕的久久| 免费看av毛片| 国产精品video| 国产精品第十页| 国产特级黄色录像| 欧美一区二区三区性视频| 国产直播在线| gogogo免费高清日本写真| 成人精品免费网站| 亚洲午夜无码久久久久| 欧美激情按摩在线| av永久不卡| 丰满少妇xbxb毛片日本| 欧美视频中文字幕| www.8ⅹ8ⅹ羞羞漫画在线看| 亚洲看片网站| av不卡在线播放| 91成年人视频| 欧美壮男野外gaytube| 911久久香蕉国产线看观看| 亚洲午夜久久久久久久久红桃 | 三级网站免费看| 日本久久电影网| sqte在线播放| 国产精品波多野结衣| 91蜜桃网址入口|