精品欧美一区二区三区在线观看 _久久久久国色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)

久久精品影视伊人网| 日本高清视频一区二区| 成人一区二区在线| youjizz在线视频| 999成人网| 欧美成人精品福利| 久久精品午夜福利| 国产激情视频在线| 91免费观看在线| 91精品久久久久久久久青青| 国产真实乱人偷精品视频| 国产成人久久| 精品少妇一区二区三区在线播放 | 欧美日韩成人| 亚洲欧美国产精品久久久久久久| 日日干日日操日日射| 日本三级一区| 亚洲精品日日夜夜| 日韩不卡av| 蜜臀av午夜精品| 久久99精品国产.久久久久久| 91超碰中文字幕久久精品| 蜜桃视频最新网址| 中文精品一区二区| 精品福利av导航| 自拍一级黄色片| 四虎影视4hu4虎成人| 亚洲大片在线观看| 国产香蕉一区二区三区| 中文字幕在线免费| 久久久久九九视频| 久久久久久久有限公司| 隣の若妻さん波多野结衣| 久久66热偷产精品| 国产精品久久久久99| 日韩精品手机在线| 好吊视频一区二区三区四区| xxxxx成人.com| 干b视频在线观看| 欧美美女啪啪| 亚洲激情 国产| 香蕉久久久久久av成人| 亚洲高清在线一区| 91精品欧美一区二区三区综合在| 91香蕉视频污版| 欧美性xxx| 色天天综合色天天久久| 成人在线观看黄| 最新欧美电影| 91黄视频在线| 在线免费观看视频黄| se01亚洲视频| 欧美日韩美少妇| 久久这里只精品| 欧美高清影院| 欧美福利电影网| 欧美激情第一区| 激情久久免费视频| 91精品蜜臀在线一区尤物| 久久成年人网站| 日韩精品久久久久久久软件91| 在线播放中文一区| 四虎国产精品免费| 福利欧美精品在线| 日韩精品免费在线播放| 亚洲a v网站| 成人黄色小视频| 日韩有码片在线观看| 国产精品国产精品88| 亚洲欧美一级二级三级| 久久91亚洲精品中文字幕奶水 | 欧美午夜激情在线| 黄色国产小视频| 日韩色性视频| 日韩欧美国产麻豆| 日本一卡二卡在线| 影视先锋久久| 久久久成人精品| 日韩欧美亚洲国产| 日韩和的一区二区| 91欧美激情另类亚洲| 亚洲国产精品一| 91麻豆免费在线观看| 日韩精彩视频| 在线电影福利片| 欧美日韩一区二区精品| 不卡的在线视频| 国产精品视屏| 怡红院精品视频| 免费中文字幕在线观看| 久久动漫亚洲| 亚洲自拍偷拍区| 头脑特工队2免费完整版在线观看| 国产欧美日韩三级| 男人草女人视频| 美女100%一区| 欧美一区二区国产| 少妇精品一区二区三区| 自拍偷拍欧美| 国产精品2018| 免费观看黄一级视频| 国产嫩草影院久久久久| 欧美国产综合在线| 免费成人高清在线视频| 日韩av在线一区| 在线免费日韩av| 日韩精品久久理论片| 97超碰人人看人人| av在线天堂播放| 欧美日韩国产精品一区二区不卡中文| 老司机久久精品| 精品在线观看入口| 久久久久久久97| 国产绿帽刺激高潮对白| 久久久国产一区二区三区四区小说| 337p亚洲精品色噜噜狠狠p| 欧洲精品一区二区三区| 亚洲激情视频网站| 欧美成人三级视频| 久久九九国产| 97se亚洲综合| a级网站在线播放| 欧美揉bbbbb揉bbbbb| 国产交换配乱淫视频免费| 亚洲视频观看| 亚洲一区二区久久久久久 | 久久成人精品视频| 中文字幕+乱码+中文| 91在线视频18| 黄网站欧美内射| 免费欧美网站| 久久在线观看视频| 国产喷水吹潮视频www| 国产精品网曝门| 91视频免费版污| 欧美禁忌电影| 日韩美女主播视频| 天堂av在线免费观看| 香蕉加勒比综合久久| av在线天堂网| 黄色欧美日韩| 国产精品视频免费观看| 七七成人影院| 精品免费国产一区二区三区四区| 久久国产高清视频| 韩国欧美国产1区| 浴室偷拍美女洗澡456在线| 亚洲电影二区| 久久国产精彩视频| 丰满人妻av一区二区三区| 一区二区三区国产| 亚洲成年人av| 国产亚洲网站| 日韩av高清在线播放| 成人在线观看免费播放| 中文字幕欧美国内| 91 中文字幕| 中文字幕一区二区视频| 91在线第一页| 亚洲视频精品| 欧美高清视频一区| 桃花岛tv亚洲品质| 搡老女人一区二区三区视频tv| 影音先锋黄色网址| 亚洲精品午夜久久久| 少妇丰满尤物大尺度写真| 国产精品vip| 久久精品国产一区二区三区日韩| 国产精品av一区二区三区| 伊人精品在线观看| av 一区二区三区| 亚洲地区一二三色| 亚洲码无人客一区二区三区| 美女网站一区二区| 伊人久久在线观看| 亚洲人成网站77777在线观看| 日韩免费中文字幕| 麻豆传媒视频在线| 精品国产乱码久久久久久久久| 成人免费区一区二区三区| 欧美韩国日本一区| 少妇高潮一69aⅹ| 久久一区二区三区超碰国产精品| 亚洲欧洲一区二区在线观看| 日韩在线视频一区二区三区| 4438全国成人免费| 毛片在线看网站| 亚洲精品一区二区三区四区高清 | 9999热视频在线观看| 亚洲人成电影在线观看天堂色| 91在线公开视频| 精品久久久久久久久久| 91香蕉视频污在线观看| 成人精品gif动图一区| 中文字幕视频在线免费观看| 欧美人成在线| 日韩精品一区二区三区丰满| 亚洲精品福利| 国产精品视频久久久| 免费在线观看的电影网站| 一区二区三区无码高清视频| 亚洲黄色精品视频| 欧美影院精品一区| 久久一级黄色片| 国产精品每日更新| 中文字幕影片免费在线观看| 国产自产高清不卡| 成年人在线看片| 18成人免费观看视频| 亚洲欧美日韩另类精品一区二区三区 | 亚洲一区亚洲二区| 唐人社导航福利精品| 久久久久久久999| av软件在线观看| 国产亚洲欧洲在线| 亚洲欧美日韩免费| 精品美女一区二区| 国产精品女人久久久| 色婷婷亚洲精品| 日韩精品手机在线| 亚洲高清免费视频| 精品97人妻无码中文永久在线 | 亚洲男人的天堂在线| 亚洲精品国产精品国| 91精品中文字幕一区二区三区| 国产精品欧美综合| 色婷婷久久久久swag精品| 国产第一页在线播放| 一区二区三区日韩欧美| 亚洲 欧美 变态 另类 综合| 国产精品久久久久影院| 亚洲天堂av中文字幕| 久久久精品黄色| 国产aⅴ激情无码久久久无码| 99re成人在线| 一起草在线视频| 99久久久国产精品免费蜜臀| 无码av免费精品一区二区三区| 国产精品99久久久久久久女警| 小早川怜子一区二区三区| 老汉av免费一区二区三区| 青青草精品视频在线观看| 丝袜美腿一区二区三区| 久草精品在线播放| 日韩精品91亚洲二区在线观看| 成人中文字幕在线播放| 国产精品日韩精品欧美精品| 国产伦精品一区二区三区四区视频_| 亚洲网站啪啪| 欧美成人一区二区在线观看| 亚洲一区二区动漫| 任你操这里只有精品| 日韩不卡一二三区| 欧美男女交配视频| 国产最新精品免费| 色哟哟免费视频| 岛国精品在线播放| 国产精品伦子伦| 国产日韩av一区| 成人做爰视频网站| 亚洲黄色在线视频| 国产香蕉视频在线| 欧美性色aⅴ视频一区日韩精品| 久草热在线观看| 91精品免费观看| 少妇人妻精品一区二区三区| 亚洲女人天堂成人av在线| 国产区视频在线| 久久亚洲精品中文字幕冲田杏梨| av免费在线观| 57pao成人国产永久免费| 九九热线视频只有这里最精品| 国产精品自产拍在线观| 日韩精品成人在线观看| 久久99精品久久久久久三级| 国产探花一区| 欧美人与动牲交xxxxbbbb| 一区二区动漫| wwwwwxxxx日本| 成人精品视频一区| 人妻熟人中文字幕一区二区| 亚洲欧美电影一区二区| 中日韩黄色大片| 91麻豆精品国产91久久久更新时间| 秋霞av鲁丝片一区二区| 夜夜嗨av一区二区三区四区| 七七成人影院| 国产欧美日韩高清| 老司机精品在线| 亚洲欧洲精品在线 | 精品中文一区| 欧美美女黄色网| 久久婷婷一区| 国产吃瓜黑料一区二区| 国产女主播一区| 精品无码人妻一区二区三区品| 91国偷自产一区二区开放时间 | 少妇一级淫免费播放| 风流少妇一区二区| gv天堂gv无码男同在线观看 | 中文字幕一区2区3区| 精品久久一区二区三区| 在线免费看av| 欧洲成人性视频| 伊人精品久久| 咪咪色在线视频| 视频在线在亚洲| 国产精品手机在线观看| 亚洲三级电影网站| 波多野结衣电影在线播放| 亚洲成av人片在线观看香蕉| 久草中文在线| 国产精品精品久久久久久| 激情av综合| 国产黄色激情视频| 精品一区二区三区在线观看 | 日韩一区免费视频| 久久伊人色综合| 四虎影视精品永久在线观看| 日韩经典在线视频| 久久久久久久欧美精品| 精品无码国产一区二区三区51安| 成人免费在线播放视频| 精品成人无码久久久久久| 日韩国产在线看| 成人免费高清观看| 99久久综合狠狠综合久久止| 五月综合激情| 17c国产在线| 国产精品国产三级国产aⅴ中文 | 日韩欧美国产一区二区三区| 欧美13一16娇小xxxx| 国产精品伦子伦免费视频| 怕怕欧美视频免费大全| 俄罗斯av网站| 99久久精品99国产精品| 日本特黄特色aaa大片免费| 日韩三级电影网址| 污影院在线观看| 97视频中文字幕| 国内一区二区三区| 国产一级伦理片| 婷婷综合在线观看| 日韩av资源站| 国产成人a亚洲精品| 免费看av成人| www.色偷偷.com| 国产精品每日更新在线播放网址| 中文字幕一区二区三区四区视频| 国产亚洲精品激情久久| 欧美v亚洲v综合v国产v仙踪林| 亚欧洲精品在线视频免费观看| 免费欧美日韩国产三级电影| 国产黄色片在线| 欧美精品成人一区二区三区四区| 黄色网址免费在线观看| 2014亚洲精品| 国产日韩亚洲| 熟女少妇内射日韩亚洲| 欧美日本在线看| 亚洲制服国产| 精品国产一区二区三区麻豆免费观看完整版| 亚洲美女视频在线免费观看| 久久精品成人av| 欧美日韩国产综合一区二区三区| 国产在线高清视频| 国产视频精品网| 久久最新视频| 91制片厂在线| 欧美v亚洲v综合ⅴ国产v| 夜鲁夜鲁夜鲁视频在线播放| 亚洲福利av| 国产成都精品91一区二区三| 91久久国产视频| 中文字幕自拍vr一区二区三区| 国产精品久久免费视频| 日韩中字在线观看| 中文字幕精品一区二区三区精品| 国产精品色综合| 97视频在线观看视频免费视频| 精品国产一区二区三区久久久樱花 | 亚洲 欧美 日韩 国产综合 在线| 国产亚洲欧美在线| 国产色在线视频| 青青在线视频一区二区三区 | 伊人成色综合网| 中文字幕一区二区三区在线不卡 | 精品成人自拍视频| 日本a√在线观看| 亚洲国产欧美一区二区三区丁香婷| 黄色美女网站在线观看| 91超碰在线电影| 日本美女一区二区三区| 久久99久久久| 中文字幕亚洲第一| 天天躁日日躁狠狠躁欧美| www.污网站| 欧洲精品一区二区| 爱搞国产精品| 男女啪啪免费观看|