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

告別硬編碼,SpringBoot實現動態增刪啟停定時任務

開發 前端
要實現動態增刪啟停定時任務功能,比較廣泛的做法是集成Quartz框架。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它框架,避免項目過于臃腫和復雜。

在spring boot項目中,可以通過@EnableScheduling注解和@Scheduled注解實現定時任務,也可以通過SchedulingConfigurer接口來實現定時任務。但是這兩種方式不能動態添加、刪除、啟動、停止任務。

要實現動態增刪啟停定時任務功能,比較廣泛的做法是集成Quartz框架。但是本人的開發原則是:在滿足項目需求的情況下,盡量少的依賴其它框架,避免項目過于臃腫和復雜。

查看spring-context這個jar包中org.springframework.scheduling.ScheduledTaskRegistrar這個類的源代碼,發現可以通過改造這個類就能實現動態增刪啟停定時任務功能。

定時任務列表頁定時任務列表頁

定時任務執行日志定時任務執行日志

添加執行定時任務的線程池配置類

@Configuration  
public class SchedulingConfig {  
    @Bean  
    public TaskScheduler taskScheduler() {  
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();  
        // 定時任務執行線程池核心線程數  
        taskScheduler.setPoolSize(4);  
        taskScheduler.setRemoveOnCancelPolicy(true);  
        taskScheduler.setThreadNamePrefix("TaskSchedulerThreadPool-");  
        return taskScheduler;  
    }  
}

添加ScheduledFuture的包裝類。ScheduledFuture是ScheduledExecutorService定時任務線程池的執行結果。

public final class ScheduledTask {  
  
    volatile ScheduledFuture<?> future;  
  
    /**  
     * 取消定時任務  
     */  
    public void cancel() {  
        ScheduledFuture<?> future = this.future;  
        if (future != null) {  
            future.cancel(true);  
        }  
    }  
}

添加Runnable接口實現類,被定時任務線程池調用,用來執行指定bean里面的方法。

public class SchedulingRunnable implements Runnable {  
  
    private static final Logger logger = LoggerFactory.getLogger(SchedulingRunnable.class);  
  
    private String beanName;  
  
    private String methodName;  
  
    private String params;  
  
    public SchedulingRunnable(String beanName, String methodName) {  
        this(beanName, methodName, null);  
    }  
  
    public SchedulingRunnable(String beanName, String methodName, String params) {  
        this.beanName = beanName;  
        this.methodName = methodName;  
        this.params = params;  
    }  
  
    @Override  
    public void run() {  
        logger.info("定時任務開始執行 - bean:{},方法:{},參數:{}", beanName, methodName, params);  
        long startTime = System.currentTimeMillis();  
  
        try {  
            Object target = SpringContextUtils.getBean(beanName);  
  
            Method method = null;  
            if (StringUtils.isNotEmpty(params)) {  
                method = target.getClass().getDeclaredMethod(methodName, String.class);  
            } else {  
                method = target.getClass().getDeclaredMethod(methodName);  
            }  
  
            ReflectionUtils.makeAccessible(method);  
            if (StringUtils.isNotEmpty(params)) {  
                method.invoke(target, params);  
            } else {  
                method.invoke(target);  
            }  
        } catch (Exception ex) {  
            logger.error(String.format("定時任務執行異常 - bean:%s,方法:%s,參數:%s ", beanName, methodName, params), ex);  
        }  
  
        long times = System.currentTimeMillis() - startTime;  
        logger.info("定時任務執行結束 - bean:{},方法:{},參數:{},耗時:{} 毫秒", beanName, methodName, params, times);  
    }  
  
    @Override  
    public boolean equals(Object o) {  
        if (this == o) return true;  
        if (o == null || getClass() != o.getClass()) return false;  
        SchedulingRunnable that = (SchedulingRunnable) o;  
        if (params == null) {  
            return beanName.equals(that.beanName) &&  
                    methodName.equals(that.methodName) &&  
                    that.params == null;  
        }  
  
        return beanName.equals(that.beanName) &&  
                methodName.equals(that.methodName) &&  
                params.equals(that.params);  
    }  
  
    @Override  
    public int hashCode() {  
        if (params == null) {  
            return Objects.hash(beanName, methodName);  
        }  
  
        return Objects.hash(beanName, methodName, params);  
    }  
}

添加定時任務注冊類,用來增加、刪除定時任務。

@Component  
public class CronTaskRegistrar implements DisposableBean {  
  
    private final Map<Runnable, ScheduledTask> scheduledTasks = new ConcurrentHashMap<>(16);  
  
    @Autowired  
    private TaskScheduler taskScheduler;  
  
    public TaskScheduler getScheduler() {  
        return this.taskScheduler;  
    }  
  
    public void addCronTask(Runnable task, String cronExpression) {  
        addCronTask(new CronTask(task, cronExpression));  
    }  
  
    public void addCronTask(CronTask cronTask) {  
        if (cronTask != null) {  
            Runnable task = cronTask.getRunnable();  
            if (this.scheduledTasks.containsKey(task)) {  
                removeCronTask(task);  
            }  
  
            this.scheduledTasks.put(task, scheduleCronTask(cronTask));  
        }  
    }  
  
    public void removeCronTask(Runnable task) {  
        ScheduledTask scheduledTask = this.scheduledTasks.remove(task);  
        if (scheduledTask != null)  
            scheduledTask.cancel();  
    }  
  
    public ScheduledTask scheduleCronTask(CronTask cronTask) {  
        ScheduledTask scheduledTask = new ScheduledTask();  
        scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());  
  
        return scheduledTask;  
    }  
  
  
    @Override  
    public void destroy() {  
        for (ScheduledTask task : this.scheduledTasks.values()) {  
            task.cancel();  
        }  
  
        this.scheduledTasks.clear();  
    }  
}

添加定時任務示例類

@Component("demoTask")  
public class DemoTask {  
    public void taskWithParams(String params) {  
        System.out.println("執行有參示例任務:" + params);  
    }  
  
    public void taskNoParams() {  
        System.out.println("執行無參示例任務");  
    }  
}

定時任務數據庫表設計

定時任務數據庫表設計定時任務數據庫表設計

public class SysJobPO {  
    /**  
     * 任務ID  
     */  
    private Integer jobId;  
    /**  
     * bean名稱  
     */  
    private String beanName;  
    /**  
     * 方法名稱  
     */  
    private String methodName;  
    /**  
     * 方法參數  
     */  
    private String methodParams;  
    /**  
     * cron表達式  
     */  
    private String cronExpression;  
    /**  
     * 狀態(1正常 0暫停)  
     */  
    private Integer jobStatus;  
    /**  
     * 備注  
     */  
    private String remark;  
    /**  
     * 創建時間  
     */  
    private Date createTime;  
    /**  
     * 更新時間  
     */  
    private Date updateTime;  
  
    public Integer getJobId() {  
        return jobId;  
    }  
  
    public void setJobId(Integer jobId) {  
        this.jobId = jobId;  
    }  
  
    public String getBeanName() {  
        return beanName;  
    }  
  
    public void setBeanName(String beanName) {  
        this.beanName = beanName;  
    }  
  
    public String getMethodName() {  
        return methodName;  
    }  
  
    public void setMethodName(String methodName) {  
        this.methodName = methodName;  
    }  
  
    public String getMethodParams() {  
        return methodParams;  
    }  
  
    public void setMethodParams(String methodParams) {  
        this.methodParams = methodParams;  
    }  
  
    public String getCronExpression() {  
        return cronExpression;  
    }  
  
    public void setCronExpression(String cronExpression) {  
        this.cronExpression = cronExpression;  
    }  
  
    public Integer getJobStatus() {  
        return jobStatus;  
    }  
  
    public void setJobStatus(Integer jobStatus) {  
        this.jobStatus = jobStatus;  
    }  
  
    public String getRemark() {  
        return remark;  
    }  
  
    public void setRemark(String remark) {  
        this.remark = remark;  
    }  
  
    public Date getCreateTime() {  
        return createTime;  
    }  
  
    public void setCreateTime(Date createTime) {  
        this.createTime = createTime;  
    }  
  
    public Date getUpdateTime() {  
        return updateTime;  
    }  
  
    public void setUpdateTime(Date updateTime) {  
        this.updateTime = updateTime;  
    }  
  
}

新增定時任務

新增定時任務新增定時任務

boolean success = sysJobRepository.addSysJob(sysJob);  
if (!success)  
    return OperationResUtils.fail("新增失敗");  
else {  
    if (sysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) {  
        SchedulingRunnable task = new SchedulingRunnable(sysJob.getBeanName(), sysJob.getMethodName(), sysJob.getMethodParams());  
        cronTaskRegistrar.addCronTask(task, sysJob.getCronExpression());  
    }  
}  
  
return OperationResUtils.success();

修改定時任務,先移除原來的任務,再啟動新任務

boolean success = sysJobRepository.editSysJob(sysJob);  
if (!success)  
    return OperationResUtils.fail("編輯失敗");  
else {  
    //先移除再添加  
    if (existedSysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) {  
        SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(), existedSysJob.getMethodName(), existedSysJob.getMethodParams());  
        cronTaskRegistrar.removeCronTask(task);  
    }  
  
    if (sysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) {  
        SchedulingRunnable task = new SchedulingRunnable(sysJob.getBeanName(), sysJob.getMethodName(), sysJob.getMethodParams());  
        cronTaskRegistrar.addCronTask(task, sysJob.getCronExpression());  
    }  
}  
  
return OperationResUtils.success();

刪除定時任務

boolean success = sysJobRepository.deleteSysJobById(req.getJobId());  
if (!success)  
    return OperationResUtils.fail("刪除失敗");  
else{  
    if (existedSysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) {  
        SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(), existedSysJob.getMethodName(), existedSysJob.getMethodParams());  
        cronTaskRegistrar.removeCronTask(task);  
    }  
}  
  
return OperationResUtils.success();

定時任務啟動/停止狀態切換

if (existedSysJob.getJobStatus().equals(SysJobStatus.NORMAL.ordinal())) {  
    SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(), existedSysJob.getMethodName(), existedSysJob.getMethodParams());  
    cronTaskRegistrar.addCronTask(task, existedSysJob.getCronExpression());  
} else {  
    SchedulingRunnable task = new SchedulingRunnable(existedSysJob.getBeanName(), existedSysJob.getMethodName(), existedSysJob.getMethodParams());  
    cronTaskRegistrar.removeCronTask(task);  
}

添加實現了CommandLineRunner接口的SysJobRunner類,當spring boot項目啟動完成后,加載數據庫里狀態為正常的定時任務。另外,關注公眾號碼猿技術專欄,回復關鍵詞9527,送你一份Spring Cloud Alibaba實戰視頻教程!

@Service  
public class SysJobRunner implements CommandLineRunner {  
  
    private static final Logger logger = LoggerFactory.getLogger(SysJobRunner.class);  
  
    @Autowired  
    private ISysJobRepository sysJobRepository;  
  
    @Autowired  
    private CronTaskRegistrar cronTaskRegistrar;  
  
    @Override  
    public void run(String... args) {  
        // 初始加載數據庫里狀態為正常的定時任務  
        List<SysJobPO> jobList = sysJobRepository.getSysJobListByStatus(SysJobStatus.NORMAL.ordinal());  
        if (CollectionUtils.isNotEmpty(jobList)) {  
            for (SysJobPO job : jobList) {  
                SchedulingRunnable task = new SchedulingRunnable(job.getBeanName(), job.getMethodName(), job.getMethodParams());  
                cronTaskRegistrar.addCronTask(task, job.getCronExpression());  
            }  
  
            logger.info("定時任務已加載完畢...");  
        }  
    }  
}

工具類SpringContextUtils,用來從spring容器里獲取bean

@Component  
public class SpringContextUtils implements ApplicationContextAware {  
  
    private static ApplicationContext applicationContext;  
  
    @Override  
    public void setApplicationContext(ApplicationContext applicationContext)  
            throws BeansException {  
        SpringContextUtils.applicationContext = applicationContext;  
    }  
  
    public static Object getBean(String name) {  
        return applicationContext.getBean(name);  
    }  
  
    public static <T> T getBean(Class<T> requiredType) {  
        return applicationContext.getBean(requiredType);  
    }  
  
    public static <T> T getBean(String name, Class<T> requiredType) {  
        return applicationContext.getBean(name, requiredType);  
    }  
  
    public static boolean containsBean(String name) {  
        return applicationContext.containsBean(name);  
    }  
  
    public static boolean isSingleton(String name) {  
        return applicationContext.isSingleton(name);  
    }  
  
    public static Class<? extends Object> getType(String name) {  
        return applicationContext.getType(name);  
    }  
}

本文完,參考本文代碼可成功運行,親測!

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2025-11-10 03:10:00

2024-02-28 09:54:07

線程池配置

2024-09-20 05:49:04

SpringBoot后端

2025-04-17 02:00:00

2024-11-04 16:01:01

2024-12-27 08:24:55

2020-12-21 07:31:23

實現單機JDK

2021-06-30 07:19:34

SpringBoot定時任務

2024-07-31 14:03:00

Spring定時任務管理

2023-12-19 08:09:06

Python定時任務Cron表達式

2025-10-09 07:47:04

2019-02-20 15:52:50

技術開發代碼

2017-08-16 16:41:04

JavaSpringBoot定時任務

2024-05-13 09:49:30

.NETQuartz庫Cron表達式

2025-02-24 16:00:00

SpringBoot定時任務開發

2024-05-31 13:07:29

.NET Core定時任務編程

2024-01-22 08:53:00

策略任務RocketMQ

2021-11-22 12:35:40

Python命令定時任務

2024-02-26 11:12:33

定時任務線程

2024-01-31 08:38:57

Python定時任務函數
點贊
收藏

51CTO技術棧公眾號

久久视频在线观看中文字幕| 欧美亚洲第一页| 国产黑丝在线视频| 四虎影视成人| 久久久久久免费网| 91麻豆国产精品| 亚欧视频在线观看| 亚洲精品一区二区在线看| 精品国产乱码久久久久久久| 美女网站免费观看视频| 牛牛精品视频在线| 亚洲国产成人自拍| 国产在线观看一区| 秋霞毛片久久久久久久久| 香蕉视频免费版| 免费国产黄色片| 久久精品国产第一区二区三区| а√在线中文在线新版| 国产亚洲短视频| 国产精品香蕉视屏| 91高潮大合集爽到抽搐| 亚洲少妇一区| 久久久久久高潮国产精品视| 亚洲色图27p| 亚洲午夜久久| 精品国产91九色蝌蚪| 午夜视频你懂的| 嗯~啊~轻一点视频日本在线观看| 中文字幕一区在线观看视频| 欧美人与物videos另类| www.成人在线观看| 国产资源在线一区| 国产精品自产拍在线观看| 可以在线观看av的网站| 欧美日韩亚洲一区二区三区在线| 日韩专区在线观看| 欧美激情视频二区| 九一精品国产| 亚洲色图五月天| 亚洲成人av免费在线观看| 一区二区亚洲视频| 日韩免费高清av| 婷婷中文字幕在线观看| 24小时成人在线视频| 欧美日韩一区中文字幕| 精品久久久噜噜噜噜久久图片| av免费不卡| 亚洲成人1区2区| 国产日本在线播放| av毛片午夜不卡高**水| 香蕉av福利精品导航| 成人免费视频91| 黄视频在线免费看| 婷婷久久综合九色综合绿巨人| 欧美精品一区二区三区三州| caoporn视频在线观看| 亚洲va韩国va欧美va| 国产一级做a爰片久久毛片男| 欧美黑人猛交的在线视频| 亚洲一区二区三区四区五区黄| 国产91在线亚洲| 97人澡人人添人人爽欧美| 精品成人av一区| 成人在线免费观看av| 欧美人体一区二区三区| 在线观看亚洲精品| jizzzz日本| 精品视频在线观看网站| 日韩欧美一级片| 尤物网站在线观看| 国产精品欧美三级在线观看| 中文字幕日韩精品有码视频| sm捆绑调教视频| 欧美日韩理论| 国产91精品高潮白浆喷水| 免费视频网站在线观看入口| 美女视频一区二区三区| 亚洲bt欧美bt日本bt| 好男人www在线视频| 91在线精品一区二区| 日韩一区不卡| 影音先锋男人在线资源| 天天av天天翘天天综合网色鬼国产| 国产乱子夫妻xx黑人xyx真爽| 日韩欧美一区二区三区免费观看 | 成人免费毛片a| 国产在线资源一区| 成全电影播放在线观看国语| 亚洲男人的天堂在线观看| 妞干网在线视频观看| 成人做爰视频www| 日韩欧美亚洲国产另类| 亚洲午夜久久久久久久久红桃| 久久亚洲精品中文字幕蜜潮电影| 欧美激情欧美狂野欧美精品| 天堂av免费在线观看| 国产成人综合在线观看| 欧美日韩在线播放一区二区| 大片免费在线观看| 色婷婷综合五月| 欧美69精品久久久久久不卡| 欧美激情在线精品一区二区三区| 欧美另类69精品久久久久9999| 精品欧美一区二区三区免费观看| 韩国理伦片一区二区三区在线播放 | 中文在线资源观看视频网站免费不卡 | 高h调教冰块play男男双性文| 国产日韩欧美电影| 国产69精品久久久久久久| 免费视频成人| 亚洲日本中文字幕| 国产一级片久久| 国精产品一区一区三区mba视频 | 欲求不满的岳中文字幕| 国产精品久久久久久久免费观看 | 亚洲人体在线| 国产一区二区三区视频在线观看 | 久久99精品久久久久久久青青日本| 欧美jizzhd69巨大| 91九色02白丝porn| 亚欧洲乱码视频| 99国产精品| 国产传媒一区二区三区| v片在线观看| 欧美精品精品一区| 99精品欧美一区二区| 免费亚洲网站| 精品综合久久久| а√天堂资源官网在线资源| 日韩欧美一级精品久久| 中文字幕影音先锋| 国产一区久久久| 色中文字幕在线观看| 久久69成人| 中文字幕综合在线| 888奇米影视| 国产精品系列在线| 一区二区三区 日韩| 精品欧美久久| 国产欧美婷婷中文| 日本中文字幕在线观看| 欧美日韩三级一区| 国产黄色片在线| 麻豆精品在线视频| 在线视频不卡一区二区| 亚洲视频资源| 欧美国产精品va在线观看| 国产xxxx在线观看| 一区二区三区欧美日| 国产裸体视频网站| 亚洲久久成人| 欧美xxxx黑人又粗又长密月| 成人免费直播| 中文字幕亚洲精品| 一级全黄裸体免费视频| 亚洲色图欧美在线| 伊人av在线播放| 在线观看视频日韩| 免费看成人午夜电影| 成人免费在线观看视频| 久久精品精品电影网| 精品国产伦一区二区三区| 亚洲成国产人片在线观看| 三级男人添奶爽爽爽视频| 日韩一区欧美二区| 伊人久久大香线蕉av一区| 国产精品igao视频网网址不卡日韩| 欧美精品在线第一页| 天天操天天操天天| 欧美午夜在线一二页| www.5588.com毛片| 99精品偷自拍| 久久久久久久片| 中文字幕免费高清网站| 老司机免费视频久久| 一区二区三区国产福利| 精品国模一区二区三区欧美| 欧美极品美女电影一区| 欧美大片aaa| 91精品国产欧美一区二区18| 国产稀缺真实呦乱在线| 国产亚洲女人久久久久毛片| 久久黄色片网站| 亚洲日本视频| 亚洲一区二三| 欧美亚洲国产日韩| 国产欧美精品xxxx另类| 成人影音在线| 色青青草原桃花久久综合| 国精产品一品二品国精品69xx| 色94色欧美sute亚洲线路一久 | 亚洲图片欧美一区| 亚洲人成人无码网www国产 | 欧美精品在线观看播放| 制服.丝袜.亚洲.中文.综合懂色| 亚洲欧洲国产专区| 性欧美13一14内谢| 岛国一区二区在线观看| 天堂中文视频在线| 亚洲激情偷拍| 日本三级福利片| 国产日产精品一区二区三区四区的观看方式| 成人免费在线视频网站| 免费电影日韩网站| 久久久久久中文| 秋霞成人影院| 亚洲天堂av在线免费观看| 亚洲国产福利视频| 欧美日韩精品一区二区三区 | 久久99国产精品成人| 中文字幕无码精品亚洲35| 中文字幕一区二区三三| 日韩精品不卡| 四虎影视精品| 国产精品10p综合二区| 在线成人免费| 国产美女扒开尿口久久久| 国产免费不卡| 欧美主播福利视频| 国产www视频在线观看| 久久九九国产精品怡红院| 国产1区2区3区在线| 亚洲欧美中文在线视频| 天天综合网在线| 亚洲成人a**站| www.我爱av| 日韩一区二区三区在线观看| 国产精品久久久久久免费播放| 在线观看一区不卡| 免费一级a毛片| 欧美亚洲日本国产| 日韩精品一区二区亚洲av观看| 欧美日韩在线看| 日本少妇做爰全过程毛片| 亚洲一卡二卡三卡四卡五卡| 国产精品 欧美激情| 亚洲美女视频在线观看| 东方av正在进入| 亚洲人xxxx| 国产三级国产精品国产国在线观看| 亚洲欧洲av一区二区三区久久| www.4hu95.com四虎| 亚洲国产精品传媒在线观看| 亚洲女优在线观看| 国产精品私人自拍| 婷婷社区五月天| 亚洲三级在线免费| 久草福利资源在线观看| 亚洲成人午夜影院| 天堂网av手机版| 色94色欧美sute亚洲线路二| 中文字幕一区二区人妻| 欧美日韩国产成人在线免费| 中文字幕乱码人妻无码久久| 欧美精品久久久久久久久老牛影院| 国产欧美久久久精品免费| 日韩精品资源二区在线| 天天操天天干天天操| 亚洲色图综合久久| 免费看a在线观看| 美女啪啪无遮挡免费久久网站| 污污片在线免费视频| 97香蕉超级碰碰久久免费软件| 亚洲十八**毛片| 国产精品免费在线免费| 国产欧美88| 国产一区二区不卡视频| 九九在线精品| 自拍视频一区二区三区| 亚洲国产专区校园欧美| 国产偷人视频免费| 狠狠色综合色综合网络| 免费看毛片的网站| 中文av字幕一区| 日本免费在线播放| 欧美在线免费播放| www.天堂在线| 亚洲午夜av久久乱码| 亚洲国产精品精华素| 51色欧美片视频在线观看| 日本十八禁视频无遮挡| 亚洲色图二区| 久久久免费视频网站| 精品一区二区三区在线观看| 99久久久无码国产精品性波多 | 久久精品一二三区| 99久久婷婷这里只有精品 | 欧美成人精品欧美一级| 精品久久久久久久久久久久久| 亚洲一线在线观看| 亚洲国内高清视频| 欧美激情午夜| 91sa在线看| 国产精品久一| 日本一区二区在线| 亚洲视频中文| 中文字幕线观看| 久久综合丝袜日本网| 亚洲欧美一区二区三区四区五区| 在线观看成人免费视频| 农村少妇久久久久久久| 日韩在线不卡视频| av综合电影网站| 成人免费视频观看视频| 久久社区一区| 成人在线免费播放视频| 成人毛片在线观看| 欧美三级在线免费观看| 欧美综合天天夜夜久久| 午夜成人免费影院| 欧美老妇交乱视频| 一级欧美视频| 亚洲精品一区二| 免费一区视频| 屁屁影院国产第一页| 夜夜夜精品看看| 国产青青草视频| 日韩一区二区三区xxxx| 成人在线爆射| 欧洲精品码一区二区三区免费看| 亚洲无线视频| 三大队在线观看| 亚洲精品久久久久久国产精华液| 依依成人在线视频| 亚洲视频在线看| 中文在线а√在线8| 久久国产欧美精品| 99热精品在线观看| 国产高清成人久久| 午夜伊人狠狠久久| 国产叼嘿视频在线观看| 欧美成年人视频网站| 粉嫩一区二区三区在线观看| 91社在线播放| 国产在线一区观看| 国产精品白丝喷水在线观看| 欧美日韩国产精品自在自线| 最新电影电视剧在线观看免费观看| 国产97在线亚洲| 欧美日韩一二三四| 美女黄色片视频| 日本一区二区三区在线不卡| 中文字幕有码视频| 日韩中文在线中文网在线观看| 成人亚洲免费| 欧美少妇一级片| 国产一区不卡在线| 久久精品国产av一区二区三区| 欧美精品一区二区三区在线| 999av小视频在线| 久久天堂国产精品| 日本欧美一区二区在线观看| 久操视频在线观看免费| 在线成人av网站| 日韩av官网| 精品国产乱码久久久久| 久久国产主播| 国产wwwwxxxx| 精品奇米国产一区二区三区| segui88久久综合9999| 欧美大陆一区二区| 日本美女一区二区三区| 日日噜噜夜夜狠狠久久波多野| 精品国精品自拍自在线| 少妇在线看www| 视频在线观看成人| 国产一区二区电影| 国产精品午夜影院| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 亚洲最大视频网| 欧美日韩在线免费| 亚洲成人三级| 国产成人精品福利一区二区三区| 香蕉久久国产| 日本中文在线视频| 日韩精品欧美激情| 9999精品免费视频| 人妻久久久一区二区三区| 国产丝袜美腿一区二区三区| www.狠狠干| 国产成人精品久久| 欧美日韩国产免费观看 | 天天做综合网| 影音先锋黄色资源| 精品婷婷伊人一区三区三| 国产盗摄在线视频网站| 亚洲韩国在线| 成人免费va视频| 在线观看毛片视频| 97视频在线播放| 99热国内精品| 右手影院亚洲欧美| 日韩欧美色综合网站| 亚洲第一影院| 777av视频| 综合久久国产九一剧情麻豆| 男人天堂亚洲二区| 肥熟一91porny丨九色丨| 麻豆精品一区二区三区| 日韩精品一区二区不卡|