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

Springboot自定義重試注解@Retryable

開發(fā) 架構(gòu)
新增重試任務(wù)成功之后,我們可通過調(diào)度平臺(tái)(比如:xxlJob),定時(shí)查詢重試任務(wù)表,然后調(diào)用RetryTaskDefinitionEnum中定義的重試的Service(retryServiceName),這里可以定義一個(gè)模板方法,根據(jù)RetryServiceName,從spring中獲取到對(duì)應(yīng)的Bean,執(zhí)行具體的業(yè)務(wù)方法,然后更新任務(wù)狀態(tài)和重試次數(shù)即可。

一、概述

微服務(wù)之間相互調(diào)用,難免會(huì)出現(xiàn)形形色色的異常,出現(xiàn)異常時(shí)有些情況可能需要先落重試任務(wù)表,然后通過任務(wù)調(diào)度等進(jìn)行定時(shí)重試;通過自定義重試注解@Retryable,減少對(duì)核心業(yè)務(wù)代碼入侵,增強(qiáng)代碼可讀性、可維護(hù)性。下面通過實(shí)戰(zhàn),開發(fā)自定義重試注解@Retryable。諸位可根據(jù)業(yè)務(wù)需要,稍作改造直接使用;如果有疑問、或者好的想法,歡迎留言,經(jīng)驗(yàn)共享。

二、實(shí)戰(zhàn)

重試任務(wù)表定義(retry_task):

CREATE TABLE `retry_task` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵值',
  `business_type_code` varchar(32) COLLATE NOT NULL DEFAULT '' COMMENT '業(yè)務(wù)類型編碼',
  `business_type_desc` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '業(yè)務(wù)類型描述',
  `retry_service_name` varchar(100) COLLATE NOT NULL DEFAULT '' COMMENT '重試的service名稱',
  `business_param` text COLLATE NOT NULL DEFAULT '' COMMENT '業(yè)務(wù)參數(shù)',
  `wait_retry_times` int(11) NOT NULL DEFAULT 3 COMMENT '待重試次數(shù)',
  `already_retry_times` int(11) NOT NULL DEFAULT 0 COMMENT '已重試次數(shù)',
  `retry_result_code` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '重試結(jié)果碼',
  `retry_result_msg` varchar(255) COLLATE NOT NULL DEFAULT '' COMMENT '重試結(jié)果描述',
  `create_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '創(chuàng)建人',
  `create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
  `update_user` varchar(36) COLLATE NOT NULL DEFAULT '' COMMENT '更新人',
  `update_time` datetime NOT NULL COMMENT '更新時(shí)間',
  PRIMARY KEY (`id`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_business_type_code` (`business_type_code`)
) COMMENT='重試任務(wù)表';

重試任務(wù)表實(shí)體類(RetryTaskEntity):

@Data
public class RetryTaskEntity implements Serializable {

    private static final long serialVersionUID = -1950778520234119369L;

    /**
     * 主鍵值
     */
    private BigInteger id;

    /**
     * 業(yè)務(wù)類型編碼
     */
    private String businessTypeCode;

    /**
     * 業(yè)務(wù)類型描述
     */
    private String businessTypeDesc;

    /**
     * 重試的service名稱
     */
    private String retryServiceName;

    /**
     * 業(yè)務(wù)參數(shù)
     */
    private String businessParam;

    /**
     * 待重試的次數(shù)
     */
    private Integer waitRetryTimes;

    /**
     * 已重試的次數(shù)
     */
    private Integer alreadyRetryTimes;

    /**
     * 重試結(jié)果碼
     */
    private String retryResultCode;

    /**
     * 重試結(jié)果描述
     */
    private String retryResultMsg;

    /**
     * 創(chuàng)建人
     */
    private String createUser;

    /**
     * 創(chuàng)建時(shí)間
     */
    private Date createTime;

    /**
     * 更新人
     */
    private String updateUser;

    /**
     * 更新時(shí)間
     */
    private Date updateTime;
}

重試任務(wù)表mapper和對(duì)應(yīng)的xml文件:

public interface RetryTaskMapper {
    int addRetryTask(RetryTaskEntity retryTaskEntity);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.boot.demo.mapper.RetryTaskMapper">

    <insert id="addRetryTask" parameterType="com.boot.demo.pojo.RetryTaskEntity">
        INSERT INTO retry_task(business_type_code,
                               business_type_desc,
                               retry_service_name,
                               business_param,
                               wait_retry_times,
                               already_retry_times,
                               retry_result_code,
                               retry_result_msg,
                               create_user,
                               create_time,
                               update_user,
                               update_time)
        VALUES (#{businessTypeCode},
                #{businessTypeDesc},
                #{retryServiceName},
                #{businessParam},
                #{waitRetryTimes},
                #{alreadyRetryTimes},
                #{retryResultCode},
                #{retryResultMsg},
                #{createUser},
                #{createTime},
                #{updateUser},
                #{updateTime})
    </insert>
</mapper>

重試任務(wù)表service和對(duì)應(yīng)的serviceImpl:

public interface RetryTaskService {
    void addRetryTask(RetryTaskEntity retryTaskEntity);
}
@Service
public class RetryTaskServiceImpl implements RetryTaskService {

    @Autowired
    private RetryTaskMapper retryTaskMapper;

    @Override
    public void addRetryTask(RetryTaskEntity retryTaskEntity) {
        retryTaskMapper.addRetryTask(retryTaskEntity);
    }
}

業(yè)務(wù)類型枚舉類(RetryTaskDefinitionEnum):

/**
 * 重試任務(wù)枚舉
 */
public enum RetryTaskDefinitionEnum {

    ADD_STOCK("101", "采購(gòu)入庫(kù)成功后新增庫(kù)存異常重試", "purchaseService", 3);

    /**
     * 業(yè)務(wù)類型編碼
     */
    private final String businessTypeCode;

    /**
     * 業(yè)務(wù)類型描述
     */
    private final String businessTypeDesc;

    /**
     * 重試的service名稱
     */
    private final String retryServiceName;

    /**
     * 重試次數(shù)
     */
    private final Integer retryTimes;

    RetryTaskDefinitionEnum(String businessTypeCode, String businessTypeDesc, String retryServiceName, Integer retryTimes) {
        this.businessTypeCode = businessTypeCode;
        this.businessTypeDesc = businessTypeDesc;
        this.retryServiceName = retryServiceName;
        this.retryTimes = retryTimes;
    }

    public static RetryTaskDefinitionEnum getTaskDefinitionByBusinessTypeCode(String businessTypeCode) {
        if (StringUtils.isBlank(businessTypeCode)) {
            return null;
        }
        for (RetryTaskDefinitionEnum taskDefinition : values()) {
            if (taskDefinition.getBusinessTypeCode().equals(businessTypeCode)) {
                return taskDefinition;
            }
        }
        return null;
    }

    public String getBusinessTypeCode() {
        return businessTypeCode;
    }

    public String getBusinessTypeDesc() {
        return businessTypeDesc;
    }

    public String getRetryServiceName() {
        return retryServiceName;
    }

    public Integer getRetryTimes() {
        return retryTimes;
    }
}

自定義注解(@MyRetryable):

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
@Documented
public @interface MyRetryable {
    RetryTaskDefinitionEnum businessType();
}

自定義注解切面(MyRetryableAspect):

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import com.boot.demo.result.Result;
import com.boot.demo.result.ResultCode;
import com.boot.demo.pojo.RetryTaskEntity;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import com.boot.demo.annotation.MyRetryable;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.ProceedingJoinPoint;
import com.boot.demo.service.RetryTaskService;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import com.boot.demo.annotation.RetryTaskDefinitionEnum;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;

@Slf4j
@Aspect
@Component
public class MyRetryableAspect {

    @Autowired
    private RetryTaskService retryTaskService;

    @Pointcut("@annotation(com.boot.demo.annotation.MyRetryable)")
    public void pointCut() {
    }

    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) {
        Result result = null;
        try {
            // 執(zhí)行目標(biāo)方法
            result = (Result) joinPoint.proceed();
            // 目標(biāo)方法返回:成功結(jié)果碼(200),則無需重試
            if (ResultCode.SUCCESS.getCode() == result.getCode()) {
                return result;
            }
            // 目標(biāo)方法返回:非成功結(jié)果碼(非200)則需重試(此次可根據(jù)需要判斷什么樣的返回碼需要重試)
            dealAddRetryTask(joinPoint);,
            return result;
        } catch (Throwable e) {
            log.error("myRetryableAspectLog error param: {} result: {} e: ", joinPoint.getArgs(), result, e);
            // 此處捕獲異常之后,也可以根據(jù)需要重試,這里就僅輸出異常日志
            return result;
        }
    }

    private void dealAddRetryTask(ProceedingJoinPoint joinPoint) {
        // 獲取重試注解信息
        MyRetryable myRetryableAnnotation = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(MyRetryable.class);
        if (null == myRetryableAnnotation) {
            return;
        }
        // 根據(jù)業(yè)務(wù)類型編碼,獲取枚舉中定義的業(yè)務(wù)類型描述、重試的service、重試次數(shù)等信息
        String businessTypeCode = myRetryableAnnotation.businessType().getBusinessTypeCode();
        RetryTaskDefinitionEnum retryTaskDefinition = RetryTaskDefinitionEnum.getTaskDefinitionByBusinessTypeCode(businessTypeCode);
        if (null == retryTaskDefinition) {
            return;
        }
        RetryTaskEntity retryTaskEntity = new RetryTaskEntity();
        retryTaskEntity.setBusinessTypeCode(businessTypeCode);
        retryTaskEntity.setBusinessTypeDesc(retryTaskDefinition.getBusinessTypeDesc());
        retryTaskEntity.setRetryServiceName(retryTaskDefinition.getRetryServiceName());
        retryTaskEntity.setBusinessParam(JSON.toJSONString(joinPoint.getArgs()[0]));
        retryTaskEntity.setWaitRetryTimes(retryTaskDefinition.getRetryTimes());
        retryTaskEntity.setAlreadyRetryTimes(0);
        retryTaskEntity.setRetryResultCode("");
        retryTaskEntity.setRetryResultMsg("");
        retryTaskEntity.setCreateUser("SYS");
        retryTaskEntity.setCreateTime(new Date());
        retryTaskEntity.setUpdateUser("SYS");
        retryTaskEntity.setUpdateTime(new Date());
        retryTaskService.addRetryTask(retryTaskEntity);
    }
}

基礎(chǔ)類(Result、ResultCode、ResultGenerator)。

Result類:

public class Result {

    private int code;
    private String message;
    private Object data;

    public Result setCode(ResultCode resultCode) {
        this.code = resultCode.getCode();
        return this;
    }

    public int getCode() {
        return code;
    }

    public Result setCode(int code) {
        this.code = code;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public Result setMessage(String message) {
        this.message = message;
        return this;
    }

    public Object getData() {
        return data;
    }

    public Result setData(Object data) {
        this.data = data;
        return this;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Result{");
        sb.append("code=").append(code);
        sb.append(", message='").append(message).append('\'');
        sb.append(", data=").append(data);
        sb.append('}');
        return sb.toString();
    }
}

ResultCode類:

public enum ResultCode {

    SUCCESS(200),
    FAIL(400),
    UNAUTHORIZED(401),
    FORBIDDEN(403),
    NOT_FOUND(404),
    INTERNAL_SERVER_ERROR(500);

    private final int code;

    ResultCode(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

ResultGenerator類:

public class ResultGenerator {

    private static final String DEFAULT_SUCCESS_MESSAGE = "SUCCESS";

    private ResultGenerator() {

    }

    public static Result genSuccessResult() {
        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE);
    }

    public static Result genSuccessResult(Object data) {
        return new Result().setCode(ResultCode.SUCCESS).setMessage(DEFAULT_SUCCESS_MESSAGE).setData(data);
    }

    public static Result genFailResult(String message) {
        return new Result().setCode(ResultCode.FAIL).setMessage(message);
    }

    public static Result genFailResult(ResultCode code, String message) {
        return new Result().setCode(code).setMessage(message);
    }

    public static Result genFailResult(String message, Object data) {
        return new Result().setCode(ResultCode.FAIL).setMessage(message).setData(data);
    }
}

測(cè)試controller(PurchaseController):

@RestController
@RequestMapping("/purchase")
public class PurchaseController {

    @Autowired
    private PurchaseService purchaseService;

    @GetMapping("/test")
    public String test(String param) {
        purchaseService.addStock(param);
        return "success";
    }
}

測(cè)試PurchaseService、和PurchaseServiceImpl

public interface PurchaseService {
    Result addStock(String param);
}
@Service("purchaseService")
public class PurchaseServiceImpl implements PurchaseService {

    @Override
    // 在需要重試的業(yè)務(wù)方法上新增重試注解即可
    @MyRetryable(businessType = RetryTaskDefinitionEnum.ADD_STOCK)
    public Result addStock(String param) {
//     return ResultGenerator.genSuccessResult();
        return ResultGenerator.genFailResult("系統(tǒng)異常...");
    }
}

三、總結(jié)

新增重試任務(wù)成功之后,我們可通過調(diào)度平臺(tái)(比如:xxlJob),定時(shí)查詢重試任務(wù)表,然后調(diào)用RetryTaskDefinitionEnum中定義的重試的service(retryServiceName),這里可以定義一個(gè)模板方法,根據(jù)retryServiceName,從spring中獲取到對(duì)應(yīng)的bean,執(zhí)行具體的業(yè)務(wù)方法,然后更新任務(wù)狀態(tài)和重試次數(shù)即可。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2024-07-02 11:42:53

SpringRedis自定義

2024-10-09 10:46:41

springboot緩存redis

2021-02-20 11:40:35

SpringBoot占位符開發(fā)技術(shù)

2023-10-09 07:37:01

2024-10-14 17:18:27

2023-10-24 13:48:50

自定義注解舉值驗(yàn)證

2024-12-27 15:37:23

2021-12-30 12:30:01

Java注解編譯器

2021-05-06 07:47:48

TestNGListener用例失敗重試

2022-02-17 07:10:39

Nest自定義注解

2022-11-01 11:15:56

接口策略模式

2020-11-25 11:20:44

Spring注解Java

2017-08-03 17:00:54

Springmvc任務(wù)執(zhí)行器

2023-03-30 16:16:00

Java自定義注解開發(fā)

2023-07-03 08:29:11

BannerSpringBoot

2015-02-12 15:33:43

微信SDK

2020-09-04 13:30:43

Java自定義代碼

2021-09-26 05:02:00

緩存Ehcache用法

2015-02-12 15:38:26

微信SDK

2022-07-11 10:37:41

MapPart集合
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久精品国产sm调教网站演员| 91在线高清视频| 毛茸茸多毛bbb毛多视频| 日韩大尺度黄色| 成人欧美一区二区三区视频网页 | 亚洲精品自拍视频| 超碰超碰在线观看| 久草在线视频资源| 国产色产综合产在线视频| 国产裸体写真av一区二区 | 欧美亚洲高清一区二区三区不卡| 一区二区三区四区久久| 欧美 日韩 人妻 高清 中文| 首页国产欧美久久| 欧美日韩福利视频| 成年人在线免费看片| 亚洲一区二区三区日本久久九| 欧美日韩亚洲精品内裤| 在线一区日本视频| 你懂的好爽在线观看| 国产精品中文字幕欧美| 日韩美女视频中文字幕| 久久精品美女视频| 亚洲精品国产成人影院| 国产午夜精品一区二区三区| 在线看黄色的网站| 国产精品一区二区三区www| 色综合天天综合给合国产| 91视频成人免费| 在线国产91| 国产日韩成人精品| 久久综合久久久| 亚洲成人一级片| 精品亚洲国内自在自线福利| 日韩美女免费线视频| 男人的天堂一区| 激情自拍一区| 欧美高清性猛交| 日韩欧美综合视频| 国产精品久久久久久| 在线观看欧美视频| 婷婷色一区二区三区| 亚洲欧美tv| 日韩激情视频在线| 狠狠人妻久久久久久综合蜜桃| 亚洲va欧美va人人爽成人影院| 欧美日韩国产小视频在线观看| 久久精品午夜福利| 户外露出一区二区三区| 色综合天天综合网国产成人综合天| 黄色国产一级视频| 极品美鲍一区| 亚洲成av人**亚洲成av**| 国产小视频免费| 丁香花在线电影小说观看| 亚洲制服丝袜av| 欧美一级视频在线播放| 白浆在线视频| 欧美性猛交xxxx富婆| 成年人网站国产| 成年人视频免费在线播放| 亚洲国产精品久久久久婷婷884| 男人天堂网站在线| 黄色羞羞视频在线观看| 婷婷久久综合九色综合伊人色| 国产日韩欧美精品在线观看| 乱馆动漫1~6集在线观看| 狠狠色香婷婷久久亚洲精品| 可以免费观看av毛片| 欧美大片1688网站| 7777精品伊人久久久大香线蕉经典版下载 | 精品成人av一区二区在线播放| 国产亚洲精品久久久久婷婷瑜伽| 欧日韩不卡在线视频| 免费无码国产精品| 看国产成人h片视频| 1区1区3区4区产品乱码芒果精品| 性生活免费网站| 成人一区二区三区在线观看| 国产亚洲精品自在久久| 日本大片在线观看| 国产免费成人在线视频| 自拍偷拍99| 51av在线| 欧美性生活影院| 操人视频免费看| 另类春色校园亚洲| 中文字幕最新精品| 国产成人精品av久久| 久久久久国产精品午夜一区| 成人免费大片黄在线播放| 超碰在线人人干| 久久网站热最新地址| 亚洲一区bb| 国产盗摄一区二区| 欧美亚男人的天堂| av电影中文字幕| 国产成人一区二区三区影院| 久久久成人精品视频| 国产做受高潮漫动| 久久国产精品99久久久久久老狼| 国产一区二区高清视频| h网站视频在线观看| 亚洲一区二区精品3399| 玩弄japan白嫩少妇hd| 日韩一二三区| 中文字幕亚洲欧美日韩2019| 国产精品suv一区二区69| 日日嗨av一区二区三区四区| 亚洲一区久久久| 搞黄视频免费在线观看| 亚洲午夜精品在线| 欧美性受xxxxxx黑人xyx性爽| 欧美亚洲大陆| 欧美丰满老妇厨房牲生活| 姑娘第5集在线观看免费好剧| 国产suv精品一区二区883| 一本色道久久综合亚洲精品婷婷| 免费在线小视频| 欧美mv日韩mv国产网站| 情侣偷拍对白清晰饥渴难耐| 国产农村妇女精品一二区| 99精品国产高清一区二区| www.av在线播放| 一本久久a久久精品亚洲| 影音先锋资源av| 自拍欧美日韩| 成人做爽爽免费视频| www.av在线| 91国在线观看| 国产交换配乱淫视频免费| 黄色亚洲大片免费在线观看| 国产欧美一区二区三区视频| 毛片网站在线| 欧美性猛xxx| 给我看免费高清在线观看| 亚洲视频一二| 国产精品综合久久久久久| av毛片在线免费看| 69久久夜色精品国产69蝌蚪网| 一色道久久88加勒比一| 亚洲欧美网站| 久久成人资源| 午夜激情在线播放| 亚洲精品美女在线观看| 久久综合亚洲色hezyo国产| 国产一区在线看| 公共露出暴露狂另类av| 国产资源一区| 日韩视频免费大全中文字幕| 中文字幕久久熟女蜜桃| 国产亚洲精品精华液| 成人免费观看视频在线观看| 天堂资源在线亚洲| 日av在线播放中文不卡| 女人天堂在线| 欧美午夜女人视频在线| 成人午夜福利一区二区| 久久久久久一区二区| 欧美三级网色| 欧美jizz18| 成年无码av片在线| www.天堂av.com| 亚洲图片欧美综合| 国产男男chinese网站| 日韩av中文在线观看| 日韩中文字幕一区二区| 欧美视频精品| 欧美精品999| 午夜视频福利在线观看| 狠狠爱在线视频一区| 国产精品无码一区二区三区| 青青草91视频| 在线观看17c| 少妇一区二区三区| 国产精品最新在线观看| 最新国产在线拍揄自揄视频| 亚洲国产成人久久综合一区| 欧美 日韩 精品| 中文字幕亚洲一区二区av在线 | 日韩成人免费av| 欧美另类在线播放| 亚洲av成人精品一区二区三区在线播放 | 欧美精品videossex性护士| 深夜福利免费在线观看| 欧美午夜一区二区三区| 久草资源在线视频| 久久久精品欧美丰满| 天堂av手机在线| 99国产精品视频免费观看一公开| 色噜噜狠狠一区二区三区| 日本在线成人| 奇米一区二区三区四区久久| 麻豆tv免费在线观看| 欧美精品一区二区三区四区| 国产又粗又爽视频| 亚洲激情一二三区| xxxxx在线观看| 国产91色综合久久免费分享| 国产一线二线三线在线观看| 欧美日韩日本国产亚洲在线| 六月婷婷久久| 伊色综合久久之综合久久| 国产97人人超碰caoprom| 亚洲国产精品精华素| 亚洲天堂av女优| 亚洲国产欧美另类| 欧美中文字幕亚洲一区二区va在线| 国产无码精品视频| 亚洲欧洲一区二区三区| www.中文字幕av| 成人网男人的天堂| 亚洲图色中文字幕| 日韩黄色免费电影| 日本在线xxx| 国产精品av久久久久久麻豆网| 日韩中文字幕一区| 久久综合影院| 麻豆精品蜜桃一区二区三区| 亚洲日本va| 成人性生交大片免费看视频直播| 日韩免费小视频| 8x拔播拔播x8国产精品| 91九色在线播放| 欧美精品在线极品| 高清免费电影在线观看| 色噜噜狠狠狠综合曰曰曰| 九色视频在线观看免费播放| 日韩av在线免费观看| 亚洲黄色小说网址| 欧美一级在线视频| 国产成人精品av在线观| 欧美丰满少妇xxxxx高潮对白| 在线观看国产区| 欧美亚洲综合另类| 日本丰满少妇做爰爽爽| 欧美性猛交xxxx黑人猛交| 久久久久久91亚洲精品中文字幕| 亚洲第一福利视频在线| 国产一级中文字幕| 亚洲成人免费视频| 日韩成人高清视频| 天天综合网天天综合色| 一级免费在线观看| 狠狠综合久久av一区二区小说 | 制服丝袜av成人在线看| 97超碰人人模人人人爽人人爱| 欧美性猛片aaaaaaa做受| 一级片在线免费播放| 欧美日精品一区视频| 在线视频播放大全| 538prom精品视频线放| 国产一区二区三区三州| 91精品婷婷国产综合久久性色| 国产婷婷在线视频| 精品国产伦理网| 五月婷婷深深爱| 亚洲欧美视频在线| www.在线视频.com| 久久国产精品久久国产精品| 香蕉久久aⅴ一区二区三区| 欧美第一淫aaasss性| 国产h片在线观看| 国产成人精品一区| 亚洲伦理网站| www.成人av| 亚洲免费成人av在线| 午夜精品一区二区三区四区| 91中文字幕精品永久在线| 亚洲一区 在线播放| 国产欧美一级| 日本在线观看免费视频| 国产毛片精品视频| 制服丝袜第一页在线观看| 久久尤物电影视频在线观看| 综合 欧美 亚洲日本| 一区二区三区美女视频| 亚洲欧美偷拍视频| 欧美电影影音先锋| 乱精品一区字幕二区| 亚洲欧洲在线播放| 1024在线播放| 庆余年2免费日韩剧观看大牛| 久久精品国产精品亚洲毛片| 国产91免费视频| 成人黄色小视频| 国产xxxx振车| 日av在线不卡| 三级视频网站在线观看| 亚洲国产精品二十页| 久久免费视频6| 欧美三级日韩在线| 欧美一级淫片免费视频魅影视频| 一区二区在线视频播放| 1024在线看片你懂得| 91精品国产综合久久香蕉的用户体验| 高清一区二区三区| 一区二区三区我不卡| 亚洲三级观看| 日本一二三四区视频| 久久综合国产精品| 久草资源在线视频| 欧美日韩国产系列| 黑人与亚洲人色ⅹvideos | 国产亚洲欧美久久久久| 欧美视频自拍偷拍| 天堂资源最新在线| 欧美丰满片xxx777| **国产精品| 亚洲高清视频在线观看| 亚洲免费成人| 不卡的一区二区| 国产精品久久久久久妇女6080| 久久久精品福利| 亚洲成人久久网| 日韩精品分区| 成人xxxxx| 成人婷婷网色偷偷亚洲男人的天堂| 霍思燕三级露全乳照| 国产精品一卡二卡| 国产探花在线视频| 欧美日韩国产一区二区三区地区| 天堂v视频永久在线播放| 欧美精品videos性欧美| 日本精品国产| 日本a级片在线观看| 麻豆精品一区二区av白丝在线| 亚洲午夜久久久久久久久红桃| 亚洲日本成人在线观看| 中文字幕在线视频免费| 亚洲欧洲偷拍精品| 九九热线视频只有这里最精品| 国产在线资源一区| 亚洲经典在线| 一本加勒比波多野结衣| 亚洲国产精品久久人人爱| 亚洲精品一区二区三区四区 | 亚洲视频导航| 卡一卡二国产精品| 在线观看天堂av| 欧美日本韩国一区二区三区视频| 99reav在线| 国产精品视频免费在线观看| 不卡中文一二三区| 日本 片 成人 在线| 国产精品欧美极品| 一级黄色录像大片| 久久夜色精品亚洲噜噜国产mv| 91麻豆精品| 中文字幕の友人北条麻妃| 国产成人亚洲综合a∨婷婷| 国产大片免费看| 精品久久国产97色综合| 2021中文字幕在线| 久热这里只精品99re8久| 日韩成人伦理电影在线观看| 怡红院一区二区三区| 欧美日韩精品一区二区三区 | 68精品国产免费久久久久久婷婷| 牛牛影视久久网| 国产成人精品无码播放| 国产精品美女一区二区| 国产免费不卡av| 久久理论片午夜琪琪电影网| 神马香蕉久久| www.99在线| 亚洲激情av在线| 亚洲 欧美 自拍偷拍| 国产成人久久精品| 91中文字幕精品永久在线| 少妇伦子伦精品无吗| 欧美日韩一区免费| 77导航福利在线| 成人91视频| 三级在线观看一区二区| 国精品人伦一区二区三区蜜桃| 日韩女同互慰一区二区| 在线人成日本视频| 一本久久a久久精品vr综合| 大桥未久av一区二区三区中文| 日本韩国欧美中文字幕| 丝袜亚洲另类欧美重口| 精品精品国产毛片在线看| 欧美精品成人网| 一区二区三区精品在线| 香蕉视频成人在线| 91精品久久久久久久久久久| 韩日在线一区| 婷婷国产成人精品视频| 亚洲成年人在线| 欧美在线se| 欧美 丝袜 自拍 制服 另类| 国产精品白丝在线| 色视频在线观看福利| 91精品久久香蕉国产线看观看| 国产女优一区| 精品无码一区二区三区电影桃花 | 久久久久欧美| 国产一区二区调教| 午夜精品久久久久久久蜜桃|