整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          超神理解:SpringBoot處理定時任務


          目經常會用到定時任務,springboot自然是可以通過整合相關組件來實現的。

          目前常用的定時任務的實現有兩種:

          1. 通過spring 自帶的定時器任務@Schedule來實現
          2. 通過Quartz來實現

          本次借用上一篇《spring boot 整合Mybatis》的既有項目結構進行案例調試。

          一、cron表達式

          無論上面說的哪種實現方式,都需要用到cron表達式,因此不得不先介紹下它。

          Cron表達式是一個字符串,由6或7個域組成,每個域有不同的含義,每個域之間用空格隔開。有2中格式:

          Seconds Minutes Hours DayofMonth Month DayofWeek Year (7個域)
          Seconds Minutes Hours DayofMonth Month DayofWeek (6個域)

          每個域可能出現的值:

          Seconds:有效范圍為0-59的整數
          Minutes:有效范圍為0-59的整數
          Hours:有效范圍為0-23的整數
          DayofMonth:有效范圍為0-31的整數
          Month:有效范圍為1-12的整數或JAN-DEC
          DayofWeek:有效范圍為1-7的整數或SUN-SAT兩個范圍。1表示星期天,2表示星期一, 依次類推
          Year:有效范圍為1970-2099年
          

          除了以上內容外,還可能出現一些特殊字符:

          (1)*:表示匹配該域的任意值,假如在Minutes域使用*, 即表示每分鐘都會觸發事件。
          
          (2)?:只能用在DayofMonth和DayofWeek兩個域。它也匹配域的任意值,但實際不會。因為DayofMonth和DayofWeek會相互影響。例如想在每月的10日觸發調度,不管10日到底是星期幾,則只能使用如下寫法: 13 13 15 10 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上并不是這樣。 
          
          (3)-:表示范圍,例如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發一次 
          
          (4)/:表示起始時間開始觸發,然后每隔固定時間觸發一次,例如在Minutes域使用5/20,則意味著5分鐘觸發一次,而25,45等分別觸發一次. 
          
          (5),:表示列出枚舉值值。例如:在Minutes域使用5,20,則意味著在5和20分每分鐘觸發一次。 
          
          (6)L:表示最后,只能出現在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味著在最后的一個星期四觸發。 
          
          (7)W:表示有效工作日(周一到周五),只能出現在DayofMonth域,系統將在離指定日期的最近的有效工作日觸發事件。例如:在 DayofMonth使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(周一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份 
          
          (8)LW:這兩個字符可以連用,表示在某個月最后一個工作日,即最后一個星期五。 
          
          (9)#:用于確定每個月第幾個星期幾,只能出現在DayofMonth域。例如在4#2,表示某月的第二個星期三。
          

          舉例:

          @Scheduled(cron = “0 0 1 1 1 ?”)//每年一月的一號的 1:00:00 執行一次

          @Scheduled(cron = “0 0 1 1 1,6 ?”) //一月和六月的一號的 1:00:00 執行一次

          @Scheduled(cron = “0 0 1 1 1,4,7,10 ?”) //每個季度的第一個月的一號的 1:00:00 執行一次

          @Scheduled(cron = “0 0 1 1 * ?”)//每月一號 1:00:00 執行一次

          @Scheduled(cron=“0 0 1 * * *”) //每天凌晨 1 點執行一次

          以上看上去有點復雜,不過不用擔心,記住常用的就行了。另外,現在網上還有 在線Cron表達式生成器可以幫助我們設定確定相關表達式內容。

          二、@Schedule實現

          1.引入依賴

          <!--添加schedule依賴-->
          <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context-support</artifactId>
          </dependency>
          

          2.代碼實現

          1. 新建類JdkSchedule@Component public class JdkSchedule { @Autowired UserService userService; @Scheduled(cron = "0/2 * * * * ?") //每個兩秒觸發一次 public void scheduleGetUserList() { System.out.println("**觸發JDK 定時器***"); List<User> list = userService.getUserList(new User()); for (User user :list ){ System.out.println(user.toString()); } } } 里面的userService為上一次添加的內容
          2. 啟動類添加注解,啟動定時任務@EnableScheduling

          3.測試效果

          每隔兩秒打印一次:

          **觸發JDK 定時器***
          User{id=1, name='sam', age=32}
          User{id=2, name='hah ', age=10}
          

          三、Quartz實現

          1.Quartz介紹

          Quartz是一個完全由Java編寫的開源任務調度的框架,通過觸發器設置作業定時運行規則,控制作業的運行時間。它包括調度器、觸發器、作業。

          組成

          描述

          Job--任務

          做什么事?

          Trigger--觸發器

          什么時候做?

          Scheduler--調度器

          什么時候需要去做什么事情?

          2.基本使用

          • 引入依賴<!--引入quartz依賴--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency>
          • 創建job類public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("...quartz job 觸發執行..."); } } 需要實現Quartz的Job接口
          • 編寫測試類:/** * quartz原生態用法 */ public class JobTestMain { public static void main(String[] args) throws SchedulerException { //1.創建job JobDetail job = JobBuilder.newJob(MyJob.class).build(); //2.創建trigger CronTrigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?")) .build(); //3.創建schedule Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); } }
          • 執行測試類JobTestMain:每三秒打印一次:...quartz job 觸發執行...

          3.springboot整合使用

          • 引入依賴<!--添加schedule依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!--引入quartz依賴--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> </dependency> <!--引入spring tx依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </dependency> springboot整合的時候,需要添加這三個依賴。
          • 編寫配置類/** * springboot整合quartz使用方法 */ @Configuration public class QuartzConfig { /** * 創建job對象 * @return */ @Bean public JobDetailFactoryBean jobDetailFactoryBean() { JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean(); jobDetailFactoryBean.setJobClass(MyJob.class); return jobDetailFactoryBean; } /** * 創建trigger對象 - cron表達式對象 * @param jobDetailFactoryBean * @return */ @Bean public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean){ CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); cronTriggerFactoryBean.setCronExpression("0/5 * * * * ?"); // 關聯JobDetail對象 cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); return cronTriggerFactoryBean; } /** * 創建trigger對象 - 一般對象 * @param jobDetailFactoryBean * @return */ @Bean public SimpleTriggerFactoryBean simpleTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) { SimpleTriggerFactoryBean simpleTriggerFactoryBean = new SimpleTriggerFactoryBean(); // 關聯JobDetail對象 simpleTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); // 設置重復次數,這里配置的是重復次數,而不是總次數; 總次數=重復次數+1,也就是說這里配置的次數是:執行完一次之后,再重復執行的次數 simpleTriggerFactoryBean.setRepeatCount(1); // 設置間隔時間 simpleTriggerFactoryBean.setRepeatInterval(2000); return simpleTriggerFactoryBean; } /** * 創建schedule對象 * @param triggerFactoryBean * @return */ @Bean public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean triggerFactoryBean){ SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(triggerFactoryBean.getObject()); return schedulerFactoryBean; } } 這里需要注意下,schedulerFactoryBean()方法中傳入的參數如果是CronTriggerFactoryBean,則執行的是cronTriggerFactoryBean()對應的設置;參數如果是SimpleTriggerFactoryBean,則執行的是simpleTriggerFactoryBean()對應的設置。
          • 啟動類添加注解@EnableScheduling
          • 測試效果每5秒鐘執行一次:...quartz job 觸發執行...如果前面的@Schedule和這里的Quartz的定時任務放在一起了,則執行效果為兩個Job一起執行:...quartz job 觸發執行... User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **觸發JDK 定時器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **觸發JDK 定時器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **觸發JDK 定時器*** ...quartz job 觸發執行... User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **觸發JDK 定時器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} **觸發JDK 定時器*** User{id=1, name='sam', age=32} User{id=2, name='hah ', age=10} ...quartz job 觸發執行...

          以上即為本文全部內容。


          作者:JAVA開發老菜鳥

          原文鏈接:https://www.cnblogs.com/sam-uncle/p/15238215.html

          趣是最好的老師,HelloGitHub 就是幫你找到興趣!

          簡介

          分享 GitHub 上有趣、入門級的開源項目。

          這是一個面向編程新手熱愛編程對開源社區感興趣 人群的月刊,月刊的內容包括:各種編程語言的項目讓生活變得更美好的工具書籍、學習筆記、教程等,這些開源項目大多都是非常容易上手,而且非常 Cool。主要是希望大家能動手用起來,加入到開源社區中。

        1. 會編程的可以貢獻代碼
        2. 不會編程的可以反饋使用這些工具中的 Bug
        3. 幫著宣傳你覺得優秀的項目
        4. Star 項目??
        5. 在瀏覽、參與這些項目的過程中,你將學習到更多編程知識提高編程技巧找到編程的樂趣

          最后 HelloGitHub 這個項目就誕生了


          以下為本期內容|每個月 28 號發刊

          C 項目

          1、ngx_waf:一個 Nginx 防火墻模塊。我差點就錯過了的寶藏項目,它使用簡單不需要復雜的配置,支持的功能直戳我的痛點。你看:

        6. 支持 IPV4、IPV6 和 IP 段黑白名單
        7. CC 防御即自動拉黑 IP 一段時間
        8. 支持 GET、POST、URL、Cookie 等黑名單(正則)
        9. C++ 項目

          2、fast-cpp-csv-parser:讀取 CSV 文件的 C++ 庫(僅頭文件)。示例代碼:

          # include "csv.h"
          
          int main(){
            io::CSVReader<3> in("ram.csv");
            in.read_header(io::ignore_extra_column, "vendor", "size", "speed");
            std::string vendor; int size; double speed;
            while(in.read_row(vendor, size, speed)){
              // 對 ram.csv 文件中的數據,做你想做的事情吧!
            }
          }
          

          3、UNO:使用 C++ 編寫的命令行 UNO 紙牌游戲。操作方便支持人機或聯機對戰,游戲基于 Asio 網絡庫和現代 C++ 開發,也有對 C++17 的嘗試。分別實現了服務端、客戶端,代碼簡單對 C++ 新手友好,UNO 的愛好者快來玩一玩吧!

          4、godot:一款功能豐富的開源游戲引擎。最初它只是一款 2D 引擎,近期拓展了 3D 部分的能力。相較于 UE4 或者 Unity 這樣的成熟商業引擎來說,Godot 還很年輕不夠成熟,尤其 3D 方面的能力。但它擁有簡易的開發方式,上手簡單。而且社區活躍、文檔覆蓋全面、有較為豐富的示例代碼,對于剛入門的游戲開發者友好。同時開源引擎底層代碼完全開源,開發者可以閱讀和貢獻代碼,而不是只停留在游戲邏輯開發層面。總而言之 Godot 是一個極有潛力的游戲引擎,推薦給想學習游戲開發的同學

          CSS 項目

          5、water.css:一個專門為簡單頁面和示例網頁準備的 CSS 框架

          Go 項目

          6、fyne:一款 Go 語言跨平臺 UI 庫。想用 Go 寫圖形界面應用的小伙伴,快速上手:

          安裝
          $ go get fyne.io/fyne
          運行一個 demo
          $ go get fyne.io/fyne/cmd/fyne_demo/
          $ fyne_demo
          

          7、golearn:Go 寫的機器學習框架。來,跑個模型試試吧:

          cd $GOPATH/src/github.com/sjwhitworth/golearn/examples/knnclassifier
          go run knnclassifier_iris.go
          

          Java 項目

          8、keepass2android:一個開源的 Android 密碼管理器。下載地址,功能:

        10. 僅需輸入一次安全性很強的密碼(很長或隨機的密碼)
        11. 支持幾乎可與所有的 Android 的瀏覽器
        12. 支持 .kdbx 文件的讀寫
        13. 能夠編輯條目包括附加字符串字段、文件附件、標簽等
        14. 等等
        15. 9、PrettyZoo:一款 Java 寫的高顏值 ZooKeeper 客戶端桌面應用。該項目使用了 JDK11 以及 JavaFX 編寫的 GUI 客戶端,代碼量適中適合想學習 JavaFX 編寫應用的朋友。需要連接 ZK 服務端查看數據的話,手邊有這么個工具還是挺方便的。實用和顏值集一身的項目

          10、vueblog:一款輕量級 Java 博客項目。基于 SpringBoot+Vue 實現并附有詳細開發文檔和講解視頻,讓剛學會 Java 的同學也能搞定。每個體面的技術人員可能都有一個自己說了算的博客吧

          JavaScript 項目

          11、x-spreadsheet:基于 JavaScript 實現的輕量級 Web 電子表格庫。它功能齊全,包含表格的基本操作和函數等,還有詳細的中文文檔,在線嘗試

          12、h5-Dooring:一款功能齊全的 H5 頁面可視化配置平臺。讓你通過可視化的方式制作出 H5 頁面,技術棧以 React 為主,后臺采用 Node.js 實現。雖然網上有很多這種工具,但本項目免費開源、功能齊全值得一試

          13、Ant-Forest:基于 Auto.js 的螞蟻森林能量自動收獲腳本。它是個“綠色環保”的項目,我能從中感受到滿滿的愛和想把它做好的決心!來看看作者開發 Ant-Forest 時解決了哪些難題:

          1. 能量球識別無法使用控件信息(使用基于霍夫變換的圖像識別)
          2. 腳本執行邏輯易被打斷(使用事件監聽及擴展模塊增強魯棒性)
          3. 每次只能運行一次(完善的復查及定時循環功能)
          4. 不同設備分辨率及屏幕比例不同(使用等比縮放/定寬縮放等進行適配)

          14、tui.image-editor:功能齊全的圖片編輯器。支持圖片剪裁、旋轉、涂鴉等功能,實現了 Vue 和 React 封裝的組件,便于整合進你的項目

          15、windows95:基于 Electron 實現的 Windows 95 操作系統。它實現了該操作系統下的所有東西,對!所有!想體驗下 Windows 95 版的掃雷嗎?下載安裝即可

          Objective-C 項目

          16、LuLu:免費開源的 macOS 防火墻軟件

          PHP 項目

          17、humhub:用 PHP 寫的開源社交平臺。看過《社交網絡》的小伙伴,都知道大名鼎鼎的 Facebook 最早就是扎克伯格用 PHP 語言寫出來的,humhub 能夠讓不會編程的小伙伴也可以用創建出一個社交平臺啦。跟著提示一步步操作,不到 1 分鐘我的社交平臺就建好了

          18、phpbrew:一個編譯、安裝、管理多版本 PHP 的工具。有了它就可以方便地在不同 PHP 版本之間自由切換啦,特性:

        16. 配置選項簡化為 Variants 無需擔心路徑問題
        17. 集成至 bash/zsh 等,易于切換版本
        18. 易于安裝、啟用 PHP 擴展
        19. Python 項目

          19、python-patterns:Python 設計模式和使用場景的集合

          20、pgcli:支持語法高亮和自動補全的 Postgres 數據庫客戶端命令行工具。它安裝簡單上手快速,如果你用過 Postgres 數據庫自帶的命令行工具,就一定能感受到 pgcli 的迷人之處

          21、15-minute-apps:基于 PyQt 框架寫的小型桌面應用程序的集合。想用 Python 寫桌面應用的小伙伴,這個項目應該可以幫到你。比如寫個掃雷游戲:

          Swift 項目

          22、Pine:一個免費、輕量、簡潔的 macOS Markdown 編輯器。功能:

        20. 主題
        21. LaTex 公式
        22. 自動保存
        23. 自定義字體
        24. 字數統計等寫作分析
        25. 等等
        26. 23、Publish:專為 Swift 開發人員準備的靜態網站生成器。讓你實現整個網站都是用 Swift 構建的工具,支持多種主題、插件以及更多強大的自定義選項。示例網站,安裝和快速開始:

          $ git clone https://github.com/JohnSundell/Publish.git
          $ cd Publish
          $ make
          $ mkdir MyWebsite
          $ cd MyWebsite
          $ publish new
          

          其它

          24、open-source-rover:NASA 面向科技愛好者開源的火星漫游車設計方案和代碼。通過該項目你可以使用便宜的樹莓派做出自己的火星漫游車,所需的零件很容易就可以買到,遙控部分是使用現成的 Xbox 手柄或者手機,減少花銷。喜歡動手和硬件的小伙伴們,這個東西夠酷嗎?

          25、bat:替代 cat 的命令行工具。你還在命令行用 cat 查看文件嗎?那你就 out 啦!今天推薦的 bat 它不僅支持語法高亮,還能展示 Git 的改動。macOS 下安裝命令:brew install bat 相信你用過 bat 后就不會再想用回 cat 了

          26、Web-Dev-For-Beginners:微軟開源的 Web 開發教程。該教程共有 24 節課,但目前只有英文版

          27、neofetch:展示操作系統信息的命令行工具,支持將近 150 種操作系統

          28、jpeg_tutorial:教你編寫 JPEG 解碼器的教程,示例為 Rust 代碼

          29、sql-style-guide:一份 SQL 語句編寫風格建議。比如:

          -- Good
          select *
          from users
          where email = 'example@domain.com'
          
          -- Bad
          select *
          from users
          where email = "example@domain.com"
          

          開源書籍

          30、pure-bash-bible:該書有好多復制就能用的 bash 函數,我愿稱其為 bash 的“奇技淫巧”。比如把字母轉為大寫的函數:

          upper() {
              # Usage: upper "string"
              printf '%s\n' "${1^^}"
          }
          
          $ upper "hello"
          HELLO
          

          機器學習

          31、pulse:根據包含馬賽克的人臉圖像,生成一張相似容貌的結果。注意不是復原哦,僅可用于人臉

          32、Surface-Defect-Detection:該項目整理了目前大量靠譜的表面缺陷檢測數據集,還有最新的頂會論文以及作者的解讀筆記。從事視覺方向的小伙伴,心動了嗎?


          最后

          迎留言告訴我本期你最喜歡那個項目,如果覺得本文還不錯的話,就點贊、轉發一波吧~

          indow對象中有兩個定時器方法:1)setInterval 2)setTimeout 兩個都是單線程的方法

          1)setInterval

          setInterval(code,time)持續的每隔一段時間執行指定的代碼,單位是毫秒(1秒=1000毫秒)

          參數1:要執行的代碼(可以是代碼或者方法) 參數2:間隔的毫秒數

          停止定時器的方法是clearInterval(定時器id)因為setInterval也可以設定多個定時,所以clearInterval方法中的id是要指定清除那個定時器的標識即定時器的返回值

          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title>定時器</title>
              <script type="text/javascript">
                  //執行代碼的方式
                  //方式1 直接書寫執行的代碼
                  function startTimer() {
                      setInterval('alert(new Date().toLocaleTimeString());', 1000);
                  }
                  //方式2 調用方法
                  //注意:1 不用忘記小括號 2 建議加分號
                  function startTimer() {
                      setInterval('doSth();', 1000);
                  }
                  //方式3 直接書寫方法名,方法名相當于一個變量
                  function startTimer() {
                      setInterval(doSth, 1000);
                  }
                  //要執行的方法
                  function doSth() {
                      alert(new Date().toLocaleTimeString());
                  }
                  //方式4 使用匿名方法  推薦! 推薦! 推薦! 
                  //包括之后的綁定事件,JQuery中基本都是匿名方法
                  function startTimer() {
                      setInterval(function () {
                          alert(new Date().toLocaleTimeString());
                      }, 1000);
                  }
              </script>
          </head>
          <body>
              <input type="button" onclick="startTimer();" value="開啟定時器" />
          </body>

          例題:文本框中的值自增

          <head>
              <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              <title>定時器</title>
              <script type="text/javascript">
                         var intervalId;//聲明定時器id;
                  function startTimer() {
                      //獲取文本框的值并轉換為數值類型
                      var num = parseInt(window.t1.value);//此處不轉換也可以
                      //在匿名方法中每隔1秒文本框值加1
                    intervalId= setInterval(function () {
                          num++;//每次自增1
                          window.t1.value = num;//將自增后的值重新賦值給文本框
                      }, 1000);
                  }
                  //停止定時器的運行
                  function stopTimer() {
                      clearInterval(intervalId);
                  }
              </script>
          </head>
          <body>
              文本框<input type="text" value="0" id="t1" /><br /><br />
              <input type="button" onclick="startTimer();" value="開始自增" />
              <input type="button" onclick="stopTimer();" value="停止自增" />
          </body>

          2)setTimeout

          setTimeout(code,time)超過多少時間只執行一次指定的代碼,單位也是毫秒

          參數1:要執行的代碼(可以是代碼或者方法) 參數2:超過多少的毫秒數

                 function showTime() {
                      setTimeout(function () {
                          alert(new Date().toLocaleTimeString());
                      }, 1000);
                  }

          停止定時器的方法: clearTimeout(定時器id)

          定時器

          兩個定時器很好區分:interval:間隔;timeout:超時

          兩個定時器的異同:

          相同點: 都是每隔多少時間執行一段代碼

          不同點:

          1) setInterval是持續的執行一段代碼;setTimeout是只執行一次

          2)停止定時器的方法名 1)setInterval的是clearInterval 2)setTimeout的是clearTimeout

          注意:定義停止定時器的id時一定要將變量定義在事件(方法)外面


          主站蜘蛛池模板: 国产熟女一区二区三区四区五区 | 国产99久久精品一区二区| 午夜无码一区二区三区在线观看| 中文字幕一区二区三区永久| 亚洲一区中文字幕| 亚洲国产成人久久综合一区77| 精品国产aⅴ无码一区二区| 国产高清在线精品一区二区三区| 亚欧在线精品免费观看一区| 一区二区三区免费在线观看| 精品深夜AV无码一区二区老年| 成人午夜视频精品一区| 精品一区狼人国产在线| 久久久无码精品国产一区| 国产精品一区三区| 国产在线精品一区二区| 呦系列视频一区二区三区| 亚洲国产精品一区二区第一页| 一区二区三区免费视频网站 | 中文字幕一区二区三区有限公司| 精品无码国产一区二区三区麻豆| 亚洲国产av一区二区三区丶| 亚洲乱码一区二区三区在线观看| 国产在线一区二区三区av| 久久精品成人一区二区三区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲中文字幕无码一区| 一区二区视频免费观看| 成人免费视频一区二区三区| 99精品国产高清一区二区麻豆| 亚洲一区二区三区四区在线观看 | 国产一区二区三区在线观看影院 | 肉色超薄丝袜脚交一区二区| 日本免费电影一区二区| 色噜噜AV亚洲色一区二区| 相泽亚洲一区中文字幕| 国产情侣一区二区三区| 中日韩一区二区三区| 国产一区二区三区在线影院| 中文无码AV一区二区三区| 变态拳头交视频一区二区|