<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java學(xué)習(xí)

    java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對(duì)文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

     

    Quartz技術(shù)

    1.觸發(fā)器(Triggers)

    與Job相比,Trigger相對(duì)來說比較簡單容易,但是要能完全的掌握使用Quartz,使其包含各種自定義的時(shí)間表選項(xiàng),我們必須先知道和理解Trigger。

    1.1日歷(Calendars)

    Quartz Calendar 對(duì)象(不是java.util.Calendar對(duì)象)能夠與被注冊(cè)進(jìn)Scheduler的Trigger關(guān)聯(lián)。Calendar對(duì)排除Trigger的 時(shí)間段是很有用的,例如,我們可以創(chuàng)建一個(gè)在每個(gè)工作日上午9:30觸發(fā)Job的Trigger,就在其中增加一個(gè)排除所有工作假期的Calendar。

    Calendar可以是任何實(shí)現(xiàn)Calendar接口的可序列化對(duì)象,如下所示:

    package org.quartz;
      public interface Calendar {
        public boolean isTimeIncluded(long timeStamp);
        public long getNextIncludedTime(long timeStamp);
      }

    該接口的參數(shù)都是long類型的,以毫秒為單位的timestamp;所以Calendar定義的時(shí)間可以準(zhǔn)確到毫秒。很可能,我們需要排除一整天,為了方便,Quartz包含了實(shí)現(xiàn)該功能的類ori.quartz.impl.HolidayCalendar。

    Calendar必須實(shí)例化并且通過addCalendar(…)方法注冊(cè)到Scheduler中,如果使用HolidayCalendar,在實(shí)例化之后,我們需要使用方法addExcludedDate(Date date)排除我們計(jì)劃日程中不需要的日期,一個(gè)Calendar實(shí)例可以用到不同的Trigger中,比如:

    HolidayCalendar cal = new HolidayCalendar();
      cal.addExcludedDate( someDate );
      sched.addCalendar("myHolidays", cal, false);
      SimpleTrigger trigger = new SimpleTrigger("myTrigger",
                                                sched.DEFAULT_GROUP,
                                                new Date(),
                                                null,
                                   SimpleTrigger.REPEAT_INDEFINITELY,
                                                60L * 1000L);
      trigger.setCalendarName("myHolidays");
      // .. schedule job with trigger
      SimpleTrigger trigger2 = new SimpleTrigger("myTrigger",
                                                 sched.DEFAULT_GROUP,
                                                 new Date(),
                                                 null,
                                                 5,
                                          5L * 24L * 60L * 60L * 1000L);
      trigger2.setCalendarName("myHolidays");
      // .. schedule job with trigger2

    上面代碼,我們創(chuàng)建了兩個(gè)Trigger:一個(gè)是每1分鐘執(zhí)行觸發(fā)一次,沒有次數(shù)限制;另一個(gè)是每5天執(zhí)行觸發(fā)一次,共執(zhí)行5次觸發(fā);然而,任何在Calendar中被排除的時(shí)間段的觸發(fā)執(zhí)行都將被取消。

    1.2 過時(shí)觸發(fā)指令(Misfire Instructions)

    Trigger另一個(gè)重要的屬性是“Misfire Instruction”。過時(shí)觸發(fā)發(fā)生在持久Trigger失去了觸發(fā)時(shí)間,由于對(duì)應(yīng)的Scheduler被關(guān)閉的原因;不同的Trigger類型有不 同的過時(shí)觸發(fā)指令,默認(rèn)情況下是使用“smart policy”指令,該指令根據(jù)Trigger類型和配置具有動(dòng)態(tài)的行為。當(dāng)scheduler啟動(dòng)時(shí),它將搜索所有過時(shí)觸發(fā)的持久Trigger,并同 時(shí)根據(jù)它們各自所配置的過時(shí)觸發(fā)指令進(jìn)行更新;當(dāng)我們?cè)陧?xiàng)目中要使用Quartz時(shí),我們必須熟悉所要使用的Trigger類型的過時(shí)觸發(fā)指示,在對(duì)應(yīng)的 JavaDOC中有對(duì)其進(jìn)行說明。可以通過方法setMisfireInstruction(…)來設(shè)置Trigger的過時(shí)觸發(fā)指示。

    1.3 觸發(fā)器的輔助類(TriggerUtils)

    TriggerUtils類(在org.quartz.helpers包中)為我們創(chuàng)建Trigger和觸發(fā)時(shí)間提供了方便,可以使我們不用 java.util.Calendar對(duì)象。使用輔助類能夠很容易地創(chuàng)建基于每分鐘、小時(shí)、天、周和月等觸發(fā)的觸發(fā)器,也可以創(chuàng)建各種各樣的日期――對(duì)設(shè) 置觸發(fā)器的啟動(dòng)時(shí)間很有用。

    1.4觸發(fā)器的監(jiān)聽器(TriggerListeners)

    Trigger能夠像Job一樣,可以把監(jiān)聽器注冊(cè)到Trigger中,實(shí)現(xiàn)了接口TriggerListener的對(duì)象就可以接收到Trigger觸發(fā)時(shí)的通知。

    2.Simple觸發(fā)器(SimpleTrigger)

    當(dāng)我們需要在規(guī)定的時(shí)間執(zhí)行一次或在規(guī)定的時(shí)間段以一定的時(shí)間間隔重復(fù)觸發(fā)執(zhí)行Job時(shí),SimpleTrigger就可以滿足上述要求。

    SimpleTrigger的屬性有:開始時(shí)間、結(jié)束時(shí)間、重復(fù)次數(shù)和重復(fù)的時(shí)間間隔,重復(fù)次數(shù)屬性的值可以為0、正整數(shù)、或常量 SimpleTrigger.REPEAT_INDEFINITELY,重復(fù)的時(shí)間間隔屬性值必須為0或長整型的正整數(shù),以毫秒作為時(shí)間單位,當(dāng)重復(fù)的時(shí) 間間隔為0時(shí),意味著與Trigger同時(shí)觸發(fā)執(zhí)行(或幾乎與Scheduler開始時(shí)同時(shí)觸發(fā)執(zhí)行)。

    如果有指定結(jié)束時(shí)間屬性值,則結(jié)束時(shí)間屬性優(yōu)先于重復(fù)次數(shù)屬性,這樣的好處在于:當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)每間隔10秒鐘觸發(fā)一次直到指定的結(jié)束時(shí)間的 Trigger,而無需去計(jì)算從開始到結(jié)束的所重復(fù)的次數(shù),我們只需簡單的指定結(jié)束時(shí)間和使用REPEAT_INDEFINITELY作為重復(fù)次數(shù)的屬性 值即可(我們也可以指定一個(gè)比在指定結(jié)束時(shí)間到達(dá)時(shí)實(shí)際執(zhí)行次數(shù)大的重復(fù)次數(shù))。

    SimpleTrigger有幾個(gè)不同的構(gòu)造方法,我們只對(duì)下面這個(gè)進(jìn)行分析:

     
    public SimpleTrigger(String name, String group, Date startTime,                       Date endTime, int repeatCount, long repeatInterval)
     

    SimpleTrigger例1――創(chuàng)建一個(gè)在當(dāng)前之后10秒鐘觸發(fā)的,執(zhí)行一次的Trigger

    long startTime = System.currentTimeMillis() + 10000L;
      SimpleTrigger trigger = new SimpleTrigger("myTrigger",
                                                sched.DEFAULT_GROUP,
                                                new Date(startTime),
                                                null,
                                                0,
                                                0L);
     

    SimpleTrigger例2――創(chuàng)建一個(gè)立即觸發(fā)的,并每間隔60秒鐘重復(fù)觸發(fā)執(zhí)行一次的Trigger

    SimpleTrigger trigger = new SimpleTrigger(”myTrigger”,

                                                sched.DEFAULT_GROUP,

                                                new Date(),

                                                null,

                                          SimpleTrigger.REPEAT_INDEFINITELY,

                                                60L * 1000L);

    SimpleTrigger例3――創(chuàng)建一個(gè)立即觸發(fā),每間隔10秒鐘重復(fù)觸發(fā)執(zhí)行一次,開始時(shí)間為當(dāng)前,結(jié)束時(shí)間為40秒鐘后的Trigger

    long endTime = System.currentTimeMillis() + 40000L;
      SimpleTrigger trigger = new SimpleTrigger("myTrigger",
                                                sched.DEFAULT_GROUP,
                                                new Date(),
                                                new Date(endTime),
                                          SimpleTrigger.REPEAT_INDEFINITELY,
                                                10L * 1000L);
     

    SimpleTrigger例4――創(chuàng)建一個(gè)在2005年5月8日早上10:30觸發(fā)的,每間隔30秒鐘重復(fù)觸發(fā)執(zhí)行一次,并且重復(fù)執(zhí)行5次(總共觸發(fā)執(zhí)行6次)的Trigger

    java.util.Calendar cal = new java.util.GregorianCalendar(2005, cal.MAY, 8);
      cal.set(cal.HOUR, 10);
      cal.set(cal.MINUTE, 30);
      cal.set(cal.SECOND, 0);
      cal.set(cal.MILLISECOND, 0);
      Data startTime = cal.getTime()
      SimpleTrigger trigger = new SimpleTrigger("myTrigger",
                                                sched.DEFAULT_GROUP,
                                                startTime,
                                                null,
                                                5,
                                                30L * 1000L);

    2.1 Simple觸發(fā)器的過時(shí)觸發(fā)指令(SimpleTrigger Misfire Instructions)

    SimpleTrigger有幾個(gè)用于當(dāng)過時(shí)觸發(fā)發(fā)生時(shí)向Quartz通知如何執(zhí)行的指令,這些指令作為常量定義在SimpleTrigger類中,分別如下:

      MISFIRE_INSTRUCTION_FIRE_NOW
      MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
      MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
      MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
      MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
        我們也可以使用前面討論的Trigger.MISFIRE_INSTRUCTION_SMART_POLICY,該指令是所有Trigger的默認(rèn)值。
       如果使用“smart policy”,SimpleTrigger將會(huì)根據(jù)實(shí)例中的配置進(jìn)行動(dòng)態(tài)的選擇過時(shí)觸發(fā)指令,JavaDOC中的SimpleTrigger.updateAfterMisfire()方法詳細(xì)解析了動(dòng)態(tài)選擇的內(nèi)容。

    3.Cron觸發(fā)器(CronTrigger)

         CronTrigger的功能比SimpleTrigger強(qiáng)大,它可以實(shí)現(xiàn)基于類似于日歷概念的作業(yè)調(diào)度,而不是單單基于一定的時(shí)間間隔的。
         使用CronTrigger,我們能夠定義如下類型的日歷型的Schedule:每個(gè)星期五的中午,每個(gè)周末的早上9:30,或者每周一、周三和周五的早上9:00到10:00每隔5分鐘。

    3.1 Cron表達(dá)式(Cron Expressions)

         Cron-Expressions用于配置CronTrigger實(shí)例,Cron-Expressions是一串字符串,實(shí)際上它由六個(gè)子字符串組成,子字符串間采用空格分離,從左到右分別代表:Seconds Minutes Hours Day-of-Month Month Day-of-Week。
    字符串“0 0 12 ? * WED”是一個(gè)完整的Cron-Expressions例子,它所表達(dá)的意思是:每周三早上12:00。
         各個(gè)子表達(dá)式的值可以是一個(gè)范圍或者列表,比如,上個(gè)例子中的Day-of-Week域的值“WED”可以用“MON-FRI”、“MON,WED,FRI”或者“MON-WED,SAT”來替代。
         所有子表達(dá)式都有指定各自的取值范圍,下面對(duì)Cron-Expressions的各個(gè)子表達(dá)式和取值范圍進(jìn)行說明:
    子表達(dá)式
                
    允許的值
                
    允許的特殊字符
                
    Seconds
    0-59
    - * /
    Minutes
    0-59
    - * /
    Hours
    0-23
    - * /
    Day-of-Month
    1-31
    - * ? / L W
    Month
    1-12或JAN-DEC
    - * /
    Day-of-Week
    1-7或SUN-SAT
    - * ? / L #
    Years(Optional)
    為空或1970-2099
    - * /

    ‘-’字符表示:值的范圍,10-12在Hours域中表示為:10、11和12;

    ‘*’字符表示:可以為任意值,‘*’在Minutes域中表示為:每分鐘;

    ‘/’字符表示:一個(gè)左邊的數(shù)值是右邊基數(shù)的遞增值,‘0/15’在Seconds域中表示為:第0、15、30和45秒,‘5/15’ 在Seconds域中表示為:第5、20、35和50;

    ‘?’字符表示:沒有對(duì)該域指定值,可以為任意值,不對(duì)該域進(jìn)行限制,‘?’只能用在Day-of-Month和Day-of-Week域中;

    ‘L’字符表示:‘L’是取‘Last’的第一個(gè)字母,也只能用在Day-of-Month和Day-of-Week域中,在Day-of-Month域 中的意思是:月份的最后一天,在Day-of-Week域中的意思是:‘7’或‘SAT’,但是在Day-of-Week域中用在另一個(gè)值后的意思是:該 月的最后一個(gè)星期幾,如:‘6L’為:該月的最后一個(gè)星期五;

    ‘W’字符表示:‘W’是取‘Weekday’的第一個(gè)字母,只能用在Day-of-Month域中,‘W’代表了最接近給定那一天的工作日,如:在 Day-of-Month域中把值設(shè)為:15W,表示的意思是:該月的第15日最接近的工作日,所以當(dāng)?shù)?5日是周六時(shí),Trigger將在第14日的周 五執(zhí)行觸發(fā),當(dāng)?shù)?5日是周天時(shí),Trigger將在第16日的周一執(zhí)行觸發(fā),當(dāng)?shù)?5日是工作日時(shí),Trigger將在第15日的當(dāng)天執(zhí)行觸發(fā);然而在 Day-of-Month域中把值設(shè)為:1W,當(dāng)?shù)?日是周六時(shí),Trigger將在第3日的周一執(zhí)行觸發(fā),因?yàn)樗粫?huì)跨越月份的范圍,‘W’字符只能是 該月中的一天,而不是一個(gè)范圍或天數(shù)的列表;在Day-of-Month 域中可以結(jié)合使用‘L’和‘W’字符‘LW’,‘LW’表示:月份的最后一個(gè)工作日;

    ‘#’字符表示:月份的第幾個(gè)星期幾,只能用在Day-of-Week域中,如:在Day-of-Week域中把值設(shè)為:6#3,表示的意思是:該月的第3個(gè)星期5(day 6=Friday and “#3”=the 3rd one in the month);2#1表示的意思是:該月的第1個(gè)星期1;4#5表示的意思是:該月的第5個(gè)星期3;需要注意:不能把值設(shè)為“#5”,因?yàn)橐粋€(gè)月中不可能有第5個(gè)星期3,如果這樣設(shè)置,將導(dǎo)致該月無法執(zhí)行觸發(fā);

    下面舉一些完整的Cron- Expressions例子:

    表達(dá)式

    意思

    0 0 12 * * ? 每天12:00執(zhí)行觸發(fā)
    0 15 10 ? * * 每天10:15執(zhí)行觸發(fā)
    0 15 10 * * ? 每天10:15執(zhí)行觸發(fā)
    0 15 10 * * ? * 每天10:15執(zhí)行觸發(fā)
    0 15 10 * * ? 2005 2005年的每天10:15執(zhí)行觸發(fā)
    0 * 14 * * ? 每天從14:00到14:59每隔1分鐘執(zhí)行一次觸發(fā)
    0 0/5 14 * * ? 每天從14:00到14:59每個(gè)5分鐘執(zhí)行一次觸發(fā)
    0 0/5 14,18 * * ? 每天從14:00到14:59和18:00到18:59每隔5分鐘執(zhí)行一次觸發(fā)
    0 0-5 14 * * ? 每天從14:00到14:05每隔1分鐘執(zhí)行一次觸發(fā)
    0 10,44 14 ? 3 WED 3月的每個(gè)星期3的14:10和14:44分別執(zhí)行一次觸發(fā)
    0 15 10 15 * ? 每月的第15日10:15執(zhí)行一次觸發(fā)
    0 15 10 L * ? 每月最后一天的10:15執(zhí)行一次觸發(fā)
    0 15 10 ? * 6L 每月的最后一個(gè)星期5的10:15執(zhí)行一次觸發(fā)
    0 15 10 ? * 2002-2005 2002、2003、2004、2005年的每個(gè)月的最后一個(gè)星期5的10:15執(zhí)行一次觸發(fā)
    0 15 10 ? * 6#3 每月的第3個(gè)星期5的10:15執(zhí)行一次觸發(fā)

    當(dāng)Schedule中要求比較復(fù)雜,采用單個(gè)的Trigger無法實(shí)現(xiàn)時(shí),可以配置多個(gè)的Trigger來實(shí)現(xiàn),比如:每天的9:00到10:00之間每 隔5分鐘執(zhí)行一次觸發(fā),并且在每天的13:00到22:00之間每隔20分鐘執(zhí)行一次觸發(fā),配置2個(gè)Trigger并把2配置好的2個(gè)Trigger注冊(cè) 到相同的Job中就可以很簡單的實(shí)現(xiàn)上述情況。





    Quartz中SimpleTrigger的探討

    讓我們繼續(xù)用第一個(gè)例子中StringTest.
    1.來寫一個(gè)每隔10秒啟動(dòng)一次任務(wù)的例子.

    import java.util.Date;

    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerFactory;
    import org.quartz.SimpleTrigger;
    import org.quartz.impl.StdSchedulerFactory;

    public class SimpleTriggerTest
    {

        
    public static void main(String[] args) throws Exception
        
    {
            SchedulerFactory schedulerFactory 
    = new StdSchedulerFactory();
            Scheduler scheduler 
    = schedulerFactory.getScheduler();
            
    // 系統(tǒng)當(dāng)前時(shí)間10秒后
            long startTime = System.currentTimeMillis() + 10000L;
            SimpleTrigger trigger 
    = new SimpleTrigger("myTrigger"nullnew Date(
                    startTime), 
    null00L);

            JobDetail jobDetail 
    = new JobDetail();
            jobDetail.setJobClass(StringTest.
    class);
            jobDetail.setName(
    "test");
            jobDetail.setGroup(
    "A");

            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
        }

    }



    2.創(chuàng)建一個(gè)觸發(fā)器,立即啟動(dòng),每隔60秒,啟動(dòng)一次.
    SimpleTrigger trigger = new SimpleTrigger("myTrigger",
                                                
    null,
                                                
    new Date(),
                                                
    null,
                                                SimpleTrigger.REPEAT_INDEFINITELY,
                                                
    60L * 1000L);
    3.創(chuàng)建一個(gè)觸發(fā)器,立即啟動(dòng).從現(xiàn)在開始的第10秒到第40秒重復(fù)運(yùn)行.
    long endTime = System.currentTimeMillis() + 40000L;

      SimpleTrigger trigger 
    = new SimpleTrigger("myTrigger",
                                                
    "myGroup",
                                                
    new Date(),
                                                
    new Date(endTime),
                                                SimpleTrigger.REPEAT_INDEFINITELY,
                                                
    10L * 1000L);
    4.創(chuàng)建一個(gè)觸發(fā)器,在2008年5月9日,上午10點(diǎn)半執(zhí)行,重復(fù)5次,每隔30秒一次.
    java.util.Calendar cal = new java.util.GregorianCalendar(2008, cal.MARCH, 9);
      cal.set(cal.HOUR, 
    10);
      cal.set(cal.MINUTE, 
    30);
      cal.set(cal.SECOND, 
    0);
      cal.set(cal.MILLISECOND, 
    0);

      Data startTime 
    = cal.getTime()

      SimpleTrigger trigger 
    = new SimpleTrigger("myTrigger",
                                                
    null,
                                                startTime,
                                                
    null,
                                                
    5,
                                                
    30L * 1000L);

    仔細(xì)體會(huì)SimpleTrigger的例子,你會(huì)發(fā)現(xiàn)用這個(gè)制作執(zhí)行計(jì)劃會(huì)更簡單方便.

    一個(gè)小例子,
    DelayTest  class
    ---------------

     package test.com.bsmart.bmc.operator.taxi;

    import java.util.Date;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.SimpleTrigger;
    import org.quartz.impl.StdSchedulerFactory;

    public class DelayTest {
        public void addDelayJob(){
            SchedulerFactory scheFact = new StdSchedulerFactory();
            Scheduler sche = null;
            try {
                sche = scheFact.getScheduler();
                sche.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
           
            JobDetail jobDetail = new JobDetail("myJob","job1",JobTest.class);
    //        JobTest jobTest = new JobTest();
           
            SimpleTrigger trigger = new SimpleTrigger("test","testGroup",new Date(new Date().getTime()+5*1000),null,5,10*1000);
           
            try {
                sche.scheduleJob(jobDetail, trigger);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
           
        }
       
        public static void main(String [] args){
            DelayTest test = new DelayTest();
            test.addDelayJob();
           
        }

    }


    job class
    -------------------------------------------------
    package test.com.bsmart.bmc.operator.taxi;

    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.SimpleTrigger;
    import org.quartz.impl.StdSchedulerFactory;

    public class JobTest implements Job{
    //    private SimpleTrigger trigger;


        public void execute(JobExecutionContext arg0) throws JobExecutionException {
            System.out.println("********************************8");
            System.out.println("********************************8");
            System.out.println("**********    job test   *******8");
            System.out.println("********************************8");
            System.out.println("********************************8");
            System.out.println("name="+arg0.getJobDetail().getName());
            System.out.println("fullname="+arg0.getJobDetail().getFullName());
            System.out.println("description="+arg0.getJobDetail().getDescription());

            System.out.println();
            System.out.println("********************************8");
            System.out.println("***********  delete the job *********8");
            SchedulerFactory scheFact = new StdSchedulerFactory();
            Scheduler sche = null;
            boolean tag = false;
            try {
                sche = scheFact.getScheduler();
    //            sche.start();
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
    //        try {
    //            tag = sche.deleteJob("myJob","job1");
    //        } catch (SchedulerException e) {
    //            // TODO Auto-generated catch block
    //            e.printStackTrace();
    //        }
           
            if(tag){
                System.out.println("delete job sucess");
            }else{
                System.out.println("delete job failed");
            }
           
        }

    }

    posted on 2008-07-31 10:59 找個(gè)美女做老婆 閱讀(3456) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 在线观看视频免费完整版| 最好免费观看韩国+日本| 亚洲成?v人片天堂网无码| 中美日韩在线网免费毛片视频| 久久精品国产亚洲AV不卡| 性xxxx视频免费播放直播| 亚洲一卡2卡4卡5卡6卡残暴在线| 免费看大美女大黄大色| 91免费福利精品国产| 亚洲aⅴ无码专区在线观看| 久久精品国产亚洲网站| 成年人在线免费看视频| 国产久爱免费精品视频 | 亚洲国产精品网站在线播放 | 亚洲爆乳AAA无码专区| 亚洲熟妇色自偷自拍另类| 免费人成网站在线播放| 久久精品无码专区免费东京热| 中文字幕在线观看免费| 亚洲成A人片在线播放器| 中文字幕一精品亚洲无线一区| 国产成人免费高清激情视频 | 亚洲人JIZZ日本人| 在线观看人成网站深夜免费| 中国一级全黄的免费观看| 成人久久久观看免费毛片| 国产精品亚洲午夜一区二区三区| 在线观看亚洲精品福利片| 亚洲高清免费视频| 亚洲成A人片在线观看中文 | 成人A毛片免费观看网站| 国产区在线免费观看| 国产一级高青免费| a级片免费观看视频| 国产精品日本亚洲777| 亚洲精品456在线播放| 亚洲精品免费在线视频| 亚洲图片中文字幕| 亚洲av日韩av无码| 狠狠亚洲狠狠欧洲2019| 在线日韩日本国产亚洲|