久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Springboot2.x+Quartz分布式集群的實現

瀏覽:56日期:2023-04-22 08:19:11

生產環境一般都是多節點高可用,Springboot本身自帶有定時任務功能,但我們項目需求要求能對定時任務進行增,刪,改,查。所以考慮引進Quartz,引入Quartz就需要考慮分布式集群,所以就有了這篇文章。

數據庫腳本

Quartz數據庫有11張表,既支持Mysql,也支持Oracle

Mysql

/*Navicat MySQL Data TransferSource Server : 10.19.34.3_ehr_adminSource Server Version : 50639Source Host : 10.19.34.3:3306Source Database : attend_base_devTarget Server Type : MYSQLTarget Server Version : 50639File Encoding : 65001Date: 2020-08-28 16:29:36*/-- SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for `qrtz_CALENDARS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_CALENDARS`;CREATE TABLE `qrtz_CALENDARS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `CALENDAR_NAME` varchar(200) NOT NULL, `CALENDAR` blob NOT NULL, PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’日歷信息’;-- ------------------------------ Records of qrtz_CALENDARS-- ------------------------------ ------------------------------ Table structure for `qrtz_FIRED_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_FIRED_TRIGGERS`;CREATE TABLE `qrtz_FIRED_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `ENTRY_ID` varchar(95) NOT NULL COMMENT ’組標識’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `INSTANCE_NAME` varchar(200) NOT NULL COMMENT ’當前實例的名稱’, `FIRED_TIME` bigint(13) NOT NULL COMMENT ’當前執行時間’, `SCHED_TIME` bigint(13) NOT NULL COMMENT ’計劃時間’, `PRIORITY` int(11) NOT NULL COMMENT ’權重’, `STATE` varchar(16) NOT NULL COMMENT ’狀態:WAITING:等待 rnPAUSED:暫停 rnACQUIRED:正常執行 rnBLOCKED:阻塞 rnERROR:錯誤’, `JOB_NAME` varchar(200) DEFAULT NULL COMMENT ’作業名稱’, `JOB_GROUP` varchar(200) DEFAULT NULL COMMENT ’作業組’, `IS_NONCONCURRENT` varchar(1) DEFAULT NULL COMMENT ’是否并行’, `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL COMMENT ’是否要求喚醒’, PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`), KEY `IDX_qrtz_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`), KEY `IDX_qrtz_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), KEY `IDX_qrtz_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), KEY `IDX_qrtz_FT_JG` (`SCHED_NAME`,`JOB_GROUP`), KEY `IDX_qrtz_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), KEY `IDX_qrtz_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’保存已經觸發的觸發器狀態信息’;-- ------------------------------ Records of qrtz_FIRED_TRIGGERS-- ------------------------------ ------------------------------ Table structure for `qrtz_JOB_DETAILS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_JOB_DETAILS`;CREATE TABLE `qrtz_JOB_DETAILS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `JOB_NAME` varchar(200) NOT NULL COMMENT ’集群中job的名字’, `JOB_GROUP` varchar(200) NOT NULL COMMENT ’集群中job的所屬組的名字’, `DESCRIPTION` varchar(250) DEFAULT NULL COMMENT ’描述’, `JOB_CLASS_NAME` varchar(250) NOT NULL COMMENT ’作業程序類名’, `IS_DURABLE` varchar(1) NOT NULL COMMENT ’是否持久’, `IS_NONCONCURRENT` varchar(1) NOT NULL COMMENT ’是否并行’, `IS_UPDATE_DATA` varchar(1) NOT NULL COMMENT ’是否更新’, `REQUESTS_RECOVERY` varchar(1) NOT NULL COMMENT ’是否要求喚醒’, `JOB_DATA` blob, PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), KEY `IDX_qrtz_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`), KEY `IDX_qrtz_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’job 詳細信息’;-- ------------------------------ Records of qrtz_JOB_DETAILS-- ------------------------------ ------------------------------ Table structure for `qrtz_LOCKS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_LOCKS`;CREATE TABLE `qrtz_LOCKS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `LOCK_NAME` varchar(40) NOT NULL COMMENT ’鎖名稱’, PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’存儲程序的悲觀鎖的信息(假如使用了悲觀鎖) ’;-- ------------------------------ Records of qrtz_LOCKS-- ------------------------------ Table structure for `qrtz_PAUSED_TRIGGER_GRPS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_PAUSED_TRIGGER_GRPS`;CREATE TABLE `qrtz_PAUSED_TRIGGER_GRPS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’存放暫停掉的觸發器’;-- ------------------------------ Records of qrtz_PAUSED_TRIGGER_GRPS-- ------------------------------ ------------------------------ Table structure for `qrtz_SCHEDULER_STATE`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_SCHEDULER_STATE`;CREATE TABLE `qrtz_SCHEDULER_STATE` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `INSTANCE_NAME` varchar(200) NOT NULL COMMENT ’實例名稱’, `LAST_CHECKIN_TIME` bigint(13) NOT NULL COMMENT ’最后的檢查時間’, `CHECKIN_INTERVAL` bigint(13) NOT NULL COMMENT ’檢查間隔’, PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’調度器狀態’;-- ------------------------------ Records of qrtz_SCHEDULER_STATE-- ------------------------------ Table structure for `qrtz_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_TRIGGERS`;CREATE TABLE `qrtz_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `JOB_NAME` varchar(200) NOT NULL COMMENT ’作業名稱’, `JOB_GROUP` varchar(200) NOT NULL COMMENT ’作業組’, `DESCRIPTION` varchar(250) DEFAULT NULL COMMENT ’描述’, `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL COMMENT ’下次執行時間’, `PREV_FIRE_TIME` bigint(13) DEFAULT NULL COMMENT ’前一次’, `PRIORITY` int(11) DEFAULT NULL COMMENT ’優先權’, `TRIGGER_STATE` varchar(16) NOT NULL COMMENT ’觸發器狀態’, `TRIGGER_TYPE` varchar(8) NOT NULL COMMENT ’觸發器類型’, `START_TIME` bigint(13) NOT NULL COMMENT ’開始時間’, `END_TIME` bigint(13) DEFAULT NULL COMMENT ’結束時間’, `CALENDAR_NAME` varchar(200) DEFAULT NULL COMMENT ’日歷名稱’, `MISFIRE_INSTR` smallint(2) DEFAULT NULL COMMENT ’失敗次數’, `JOB_DATA` blob, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), KEY `IDX_qrtz_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), KEY `IDX_qrtz_T_JG` (`SCHED_NAME`,`JOB_GROUP`), KEY `IDX_qrtz_T_C` (`SCHED_NAME`,`CALENDAR_NAME`), KEY `IDX_qrtz_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`), KEY `IDX_qrtz_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`), KEY `IDX_qrtz_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), KEY `IDX_qrtz_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), KEY `IDX_qrtz_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`), KEY `IDX_qrtz_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`), KEY `IDX_qrtz_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`), KEY `IDX_qrtz_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`), KEY `IDX_qrtz_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’觸發器’;-- ------------------------------ Records of qrtz_TRIGGERS-- ------------------------------ Table structure for `qrtz_SIMPLE_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_SIMPLE_TRIGGERS`;CREATE TABLE `qrtz_SIMPLE_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `REPEAT_COUNT` bigint(7) NOT NULL COMMENT ’重復次數’, `REPEAT_INTERVAL` bigint(12) NOT NULL COMMENT ’重復間隔’, `TIMES_TRIGGERED` bigint(10) NOT NULL COMMENT ’觸發次數’, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’簡單的觸發器’;-- ------------------------------ Records of qrtz_SIMPLE_TRIGGERS-- ------------------------------ ------------------------------ Table structure for `qrtz_SIMPROP_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_SIMPROP_TRIGGERS`;CREATE TABLE `qrtz_SIMPROP_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `STR_PROP_1` varchar(512) DEFAULT NULL, `STR_PROP_2` varchar(512) DEFAULT NULL, `STR_PROP_3` varchar(512) DEFAULT NULL, `INT_PROP_1` int(11) DEFAULT NULL, `INT_PROP_2` int(11) DEFAULT NULL, `LONG_PROP_1` bigint(20) DEFAULT NULL, `LONG_PROP_2` bigint(20) DEFAULT NULL, `DEC_PROP_1` decimal(13,4) DEFAULT NULL, `DEC_PROP_2` decimal(13,4) DEFAULT NULL, `BOOL_PROP_1` varchar(1) DEFAULT NULL, `BOOL_PROP_2` varchar(1) DEFAULT NULL, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’存儲CalendarIntervalTrigger和DailyTimeIntervalTrigger兩種類型的觸發器’;-- ------------------------------ Records of qrtz_SIMPROP_TRIGGERS-- ------------------------------ ------------------------------ Table structure for `qrtz_BLOB_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_BLOB_TRIGGERS`;CREATE TABLE `qrtz_BLOB_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `BLOB_DATA` blob, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’以Blob 類型存儲的觸發器’;-- ------------------------------ Records of qrtz_BLOB_TRIGGERS-- ------------------------------ ------------------------------ Table structure for `qrtz_CRON_TRIGGERS`-- ------------------------------ DROP TABLE IF EXISTS `qrtz_CRON_TRIGGERS`;CREATE TABLE `qrtz_CRON_TRIGGERS` ( `SCHED_NAME` varchar(120) NOT NULL COMMENT ’計劃名稱’, `TRIGGER_NAME` varchar(200) NOT NULL COMMENT ’觸發器名稱’, `TRIGGER_GROUP` varchar(200) NOT NULL COMMENT ’觸發器組’, `CRON_EXPRESSION` varchar(120) NOT NULL COMMENT ’時間表達式’, `TIME_ZONE_ID` varchar(80) DEFAULT NULL COMMENT ’時區ID nvarchar 80’, PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’定時觸發器’;-- ------------------------------ Records of qrtz_CRON_TRIGGERS-- ----------------------------Oraclecreate table QRTZ_CALENDARS( sched_name VARCHAR2(120) not null, calendar_name VARCHAR2(200) not null, calendar BLOB not null);alter table QRTZ_CALENDARS add constraint PK_QRTZ_CALENDARS primary key (SCHED_NAME, CALENDAR_NAME);create table QRTZ_FIRED_TRIGGERS( sched_name VARCHAR2(120) not null, entry_id VARCHAR2(95) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, instance_name VARCHAR2(200) not null, fired_time NUMBER(13) not null, sched_time NUMBER(13) not null, priority INTEGER not null, state VARCHAR2(16) not null, job_name VARCHAR2(200), job_group VARCHAR2(200), is_nonconcurrent VARCHAR2(1), requests_recovery VARCHAR2(1));alter table QRTZ_FIRED_TRIGGERS add constraint PK_QRTZ_FIRED_TRIGGERS primary key (SCHED_NAME, ENTRY_ID);create table QRTZ_JOB_DETAILS( sched_name VARCHAR2(120) not null, job_name VARCHAR2(200) not null, job_group VARCHAR2(200) not null, description VARCHAR2(250), job_class_name VARCHAR2(250) not null, is_durable VARCHAR2(1) not null, is_nonconcurrent VARCHAR2(1) not null, is_update_data VARCHAR2(1) not null, requests_recovery VARCHAR2(1) not null, job_data BLOB);alter table QRTZ_JOB_DETAILS add constraint PK_QRTZ_JOB_DETAILS primary key (SCHED_NAME, JOB_NAME, JOB_GROUP);create table QRTZ_LOCKS( sched_name VARCHAR2(120) not null, lock_name VARCHAR2(40) not null);alter table QRTZ_LOCKS add constraint PK_QRTZ_LOCKS primary key (SCHED_NAME, LOCK_NAME);create table QRTZ_PAUSED_TRIGGER_GRPS( sched_name VARCHAR2(120) not null, trigger_group VARCHAR2(200) not null);alter table QRTZ_PAUSED_TRIGGER_GRPS add constraint PK__TRIGGER_GRPS primary key (SCHED_NAME, TRIGGER_GROUP);create table QRTZ_SCHEDULER_STATE( sched_name VARCHAR2(120) not null, instance_name VARCHAR2(200) not null, last_checkin_time NUMBER(13) not null, checkin_interval NUMBER(13) not null);alter table QRTZ_SCHEDULER_STATE add constraint PK_QRTZ_SCHEDULER_STATE primary key (SCHED_NAME, INSTANCE_NAME);create table QRTZ_TRIGGERS( sched_name VARCHAR2(120) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, job_name VARCHAR2(200) not null, job_group VARCHAR2(200) not null, description VARCHAR2(250), next_fire_time NUMBER(13), prev_fire_time NUMBER(13), priority INTEGER, trigger_state VARCHAR2(16) not null, trigger_type VARCHAR2(8) not null, start_time NUMBER(13) not null, end_time NUMBER(13), calendar_name VARCHAR2(200), misfire_instr NUMBER(2), job_data BLOB);alter table QRTZ_TRIGGERS add constraint PK_QRTZ_TRIGGERS primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);create table QRTZ_SIMPLE_TRIGGERS( sched_name VARCHAR2(120) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, repeat_count NUMBER(7) not null, repeat_interval NUMBER(12) not null, times_triggered NUMBER(10) not null);alter table QRTZ_SIMPLE_TRIGGERS add constraint PK_QRTZ_SIMPLE_TRIGGERS primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);create table QRTZ_SIMPROP_TRIGGERS( sched_name VARCHAR2(120) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, str_prop_1 VARCHAR2(512), str_prop_2 VARCHAR2(512), str_prop_3 VARCHAR2(512), int_prop_1 INTEGER, int_prop_2 INTEGER, long_prop_1 NUMBER, long_prop_2 NUMBER, dec_prop_1 NUMBER(13,4), dec_prop_2 NUMBER(13,4), bool_prop_1 VARCHAR2(1), bool_prop_2 VARCHAR2(1));alter table QRTZ_SIMPROP_TRIGGERS add constraint PK_QRTZ_SIMPROP_TRIGGERS primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);create table QRTZ_BLOB_TRIGGERS( sched_name VARCHAR2(120) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, blob_data BLOB);alter table QRTZ_BLOB_TRIGGERS add constraint PK_QRTZ_BLOB_TRIGGERS primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);create table QRTZ_CRON_TRIGGERS( sched_name VARCHAR2(120) not null, trigger_name VARCHAR2(200) not null, trigger_group VARCHAR2(200) not null, cron_expression VARCHAR2(200) not null, time_zone_id VARCHAR2(80));alter table QRTZ_CRON_TRIGGERS add constraint PK_QRTZ_CRON_TRIGGERS primary key (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);delete from QRTZ_JOB_DETAILS;delete from QRTZ_CRON_TRIGGERS;delete from QRTZ_BLOB_TRIGGERS;delete from QRTZ_CALENDARS;delete from QRTZ_FIRED_TRIGGERS;delete from QRTZ_LOCKS;delete from QRTZ_PAUSED_TRIGGER_GRPS;delete from QRTZ_SCHEDULER_STATE;delete from QRTZ_SIMPLE_TRIGGERS;delete from QRTZ_SIMPROP_TRIGGERS;delete from QRTZ_TRIGGERS;

Maven

我這里后臺使用的是Springboot2.1

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>

application.yml

quartz: #quartz相關屬性配置 properties: org: quartz: scheduler: instanceName: clusteredScheduler #調度器的實例名 instanceId: AUTO #調度器編號自動生成 jobStore: class: org.quartz.impl.jdbcjobstore.JobStoreTX driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate tablePrefix: qrtz_ #數據庫表名前綴 isClustered: true #開啟分布式部署 clusterCheckinInterval: 10000 #分布式節點有效性檢查時間間隔,單位:秒 useProperties: false threadPool: class: org.quartz.simpl.SimpleThreadPool #自帶的線程池實現類 threadCount: 10 #開啟10個線程 threadPriority: 5 #工作者線程的優先級 threadsInheritContextClassLoaderOfInitializingThread: true #數據庫方式 job-store-type: jdbc

Bean

import org.quartz.JobDataMap;import java.util.Date;/** * @program: QuartzBean * @description: * @author: Yuwl * @create: 2020-06-02 18:36 **/public class QuartzBean { /** 任務id */ private String id; /** 任務名稱 */ private String jobName; /** 任務組 */ private String jobGroup; /** 任務執行類 */ private String jobClass; /** 任務狀態 啟動還是暫停*/ private Integer status; /** * 任務開始時間 */ private Date startTime; /** * 任務循環間隔-單位:分鐘 */ private Integer interval; /** * 任務結束時間 */ private Date endTime; /** 任務運行時間表達式 */ private String cronExpression; private JobDataMap jobDataMap; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobClass() { return jobClass; } public void setJobClass(String jobClass) { this.jobClass = jobClass; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public Integer getInterval() { return interval; } public void setInterval(Integer interval) { this.interval = interval; } public Date getEndTime() { return endTime; } public void setEndTime(Date endTime) { this.endTime = endTime; } public JobDataMap getJobDataMap() { return jobDataMap; } public void setJobDataMap(JobDataMap jobDataMap) { this.jobDataMap = jobDataMap; } public String getJobGroup() { return jobGroup; } public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; }}

Service

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;import com.ruoyi.framework.quartz.QuartzBean;import org.quartz.*;import org.quartz.impl.matchers.GroupMatcher;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.ArrayList;import java.util.List;import java.util.Set;/** * @program: QuartzJobService * @description: * @author: Yuwl * @create: 2020-07-21 17:00 **/@Servicepublic class QuartzJobService { @Autowired private Scheduler scheduler; /** * 創建定時任務Simple * quartzBean.getInterval()==null表示單次提醒, * 否則循環提醒(quartzBean.getEndTime()!=null) * @param quartzBean */ public void createScheduleJobSimple(QuartzBean quartzBean) throws Exception{ //獲取到定時任務的執行類 必須是類的絕對路徑名稱 //定時任務類需要是job類的具體實現 QuartzJobBean是job的抽象類。 Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass()); // 構建定時任務信息 JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(quartzBean.getJobName(), ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null).setJobData(quartzBean.getJobDataMap()).build(); // 設置定時任務執行方式 SimpleScheduleBuilder simpleScheduleBuilder = null; if (quartzBean.getInterval() == null) { //單次 simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule(); } else { //循環 simpleScheduleBuilder = SimpleScheduleBuilder.repeatMinutelyForever(quartzBean.getInterval()); } // 構建觸發器trigger Trigger trigger = null; if (quartzBean.getInterval() == null) { //單次 trigger = TriggerBuilder.newTrigger() .withIdentity(quartzBean.getJobName(),ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null) .withSchedule(simpleScheduleBuilder) .startAt(quartzBean.getStartTime()) .build(); } else { //循環 trigger = TriggerBuilder.newTrigger() .withIdentity(quartzBean.getJobName(),ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null) .withSchedule(simpleScheduleBuilder) .startAt(quartzBean.getStartTime()) .endAt(quartzBean.getEndTime()) .build(); } scheduler.scheduleJob(jobDetail, trigger); } /** * 創建定時任務Cron * 定時任務創建之后默認啟動狀態 * @param quartzBean 定時任務信息類 * @throws Exception */ public void createScheduleJobCron(QuartzBean quartzBean) throws Exception{ //獲取到定時任務的執行類 必須是類的絕對路徑名稱 //定時任務類需要是job類的具體實現 QuartzJobBean是job的抽象類。 Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass()); // 構建定時任務信息 JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(quartzBean.getJobName()).setJobData(quartzBean.getJobDataMap()).build(); // 設置定時任務執行方式 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCronExpression()); // 構建觸發器trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(quartzBean.getJobName()).withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, trigger); } /** * 根據任務名稱暫停定時任務 * @param jobName 定時任務名稱 * @param jobGroup 任務組(沒有分組傳值null) * @throws Exception */ public void pauseScheduleJob(String jobName,String jobGroup) throws Exception{ JobKey jobKey = JobKey.jobKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); scheduler.pauseJob(jobKey); } /** * 根據任務名稱恢復定時任務 * @param jobName 定時任務名 * @param jobGroup 任務組(沒有分組傳值null) * @throws SchedulerException */ public void resumeScheduleJob(String jobName,String jobGroup) throws Exception { JobKey jobKey = JobKey.jobKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); scheduler.resumeJob(jobKey); } /** * 根據任務名稱立即運行一次定時任務 * @param jobName 定時任務名稱 * @param jobGroup 任務組(沒有分組傳值null) * @throws SchedulerException */ public void runOnce(String jobName,String jobGroup) throws Exception{ JobKey jobKey = JobKey.jobKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); scheduler.triggerJob(jobKey); } /** * 更新定時任務Simple * @param quartzBean 定時任務信息類 * @throws SchedulerException */ public void updateScheduleJobSimple(QuartzBean quartzBean) throws Exception { //獲取到對應任務的觸發器 TriggerKey triggerKey = TriggerKey.triggerKey(quartzBean.getJobName(), ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null); // 設置定時任務執行方式 SimpleScheduleBuilder simpleScheduleBuilder = null; if (quartzBean.getInterval() == null) { //單次 simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule(); } else { //循環 simpleScheduleBuilder = SimpleScheduleBuilder.repeatMinutelyForever(quartzBean.getInterval()); } // 構建觸發器trigger Trigger trigger = null; if (quartzBean.getInterval() == null) { //單次 trigger = TriggerBuilder.newTrigger() .withIdentity(quartzBean.getJobName(), ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null) .withSchedule(simpleScheduleBuilder) .startAt(quartzBean.getStartTime()) .build(); } else { //循環 TriggerBuilder.newTrigger() .withIdentity(quartzBean.getJobName(), ObjectUtils.isNotEmpty(quartzBean.getJobGroup()) ?quartzBean.getJobGroup():null) .withSchedule(simpleScheduleBuilder) .startAt(quartzBean.getStartTime()) .endAt(quartzBean.getEndTime()) .build(); } //重置對應的job scheduler.rescheduleJob(triggerKey, trigger); } /** * 更新定時任務Cron * @param quartzBean 定時任務信息類 * @throws SchedulerException */ public void updateScheduleJobCron(QuartzBean quartzBean) throws Exception { //獲取到對應任務的觸發器 TriggerKey triggerKey = TriggerKey.triggerKey(quartzBean.getJobName()); //設置定時任務執行方式 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCronExpression()); //重新構建任務的觸發器trigger CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //重置對應的job scheduler.rescheduleJob(triggerKey, trigger); } /** * 根據定時任務名稱從調度器當中刪除定時任務 * @param jobName 定時任務名稱 * @param jobGroup 任務組(沒有分組傳值null) * @throws SchedulerException */ public void deleteScheduleJob(String jobName,String jobGroup) throws Exception { JobKey jobKey = JobKey.jobKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); scheduler.deleteJob(jobKey); } /** * 獲取任務狀態 * @param jobName * @param jobGroup 任務組(沒有分組傳值null) * @return * (' BLOCKED ', ' 阻塞 '); * ('COMPLETE', '完成'); * ('ERROR', '出錯'); * ('NONE', '不存在'); * ('NORMAL', '正常'); * ('PAUSED', '暫停'); */ public String getScheduleJobStatus(String jobName,String jobGroup) throws Exception { TriggerKey triggerKey = TriggerKey.triggerKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); Trigger.TriggerState state = scheduler.getTriggerState(triggerKey); return state.name(); } /** * 根據定時任務名稱來判斷任務是否存在 * @param jobName 定時任務名稱 * @param jobGroup 任務組(沒有分組傳值null) * @throws SchedulerException */ public Boolean checkExistsScheduleJob(String jobName,String jobGroup) throws Exception { JobKey jobKey = JobKey.jobKey(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); return scheduler.checkExists(jobKey); } /** * 根據任務??h除定?r任務 * @param jobGroup 任務組 * @throws SchedulerException */ public Boolean deleteGroupJob(String jobGroup) throws Exception { GroupMatcher<JobKey> matcher = GroupMatcher.groupEquals(jobGroup); Set<JobKey> jobkeySet = scheduler.getJobKeys(matcher); List<JobKey> jobkeyList = new ArrayList<JobKey>(); jobkeyList.addAll(jobkeySet); return scheduler.deleteJobs(jobkeyList); } /** * 根據任務?批量?h除定?r任務 * @param jobkeyList * @throws SchedulerException */ public Boolean batchDeleteGroupJob(List<JobKey> jobkeyList) throws Exception { return scheduler.deleteJobs(jobkeyList); } /** * 根據任務?批量查詢出jobkey * @param jobGroup 任務組 * @throws SchedulerException */ public void batchQueryGroupJob(List<JobKey> jobkeyList,String jobGroup) throws Exception { GroupMatcher<JobKey> matcher = GroupMatcher.groupEquals(jobGroup); Set<JobKey> jobkeySet = scheduler.getJobKeys(matcher); jobkeyList.addAll(jobkeySet); }}

Job

package com.quartz.demo.jobimport org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.springframework.scheduling.quartz.QuartzJobBean;import org.springframework.stereotype.Component;import java.util.Date;/** * @program: job * @description: * @author: Yuwl * @create: 2020-06-02 18:07 **/@Componentpublic class MyTask extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); JobDataMap map = context.getJobDetail().getJobDataMap(); String userId = map.getString('userId'); System.out.println('SimpleJob says: ' + jobKey + ', userId: ' + userId + ' executing at ' + new Date()); }}

Controller

import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;import com.ruoyi.common.utils.DateUtils;import com.ruoyi.framework.quartz.QuartzBean;import com.ruoyi.framework.quartz.service.QuartzJobService;import org.quartz.JobDataMap;import org.quartz.SchedulerException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.text.ParseException;import java.util.Date;/** * @program: JobController * @description: * @author: Yuwl * @create: 2020-07-21 17:08 **/@RestController@RequestMapping('/api/quartz/')public class JobController { @Autowired private QuartzJobService quartzJobService; //創建&啟動 @GetMapping('startSimpleJob') public String startSimpleJob() throws SchedulerException, ClassNotFoundException, ParseException { QuartzBean quartzBean = new QuartzBean(); quartzBean.setJobClass('com.quartz.demo.job.MyTask'); quartzBean.setJobName('job1'); JobDataMap map = new JobDataMap(); map.put('userId', '123456'); quartzBean.setJobDataMap(map); Date now = new Date(); quartzBean.setStartTime(DateUtils.addSeconds(now, 10)); quartzBean.setInterval(10); quartzBean.setEndTime(DateUtils.addMinutes(now, 1)); try { quartzJobService.createScheduleJobSimple(quartzBean); } catch (Exception e) { e.printStackTrace(); } return 'startJob Success!'; } /** * 創建cron Job * @param quartzBean * @return */ @RequestMapping('/createCronJob') @ResponseBody public String createJob(QuartzBean quartzBean) { try { //進行測試所以寫死 quartzBean.setJobClass('com.quartz.demo.job.MyTask'); quartzBean.setJobName('job1'); quartzBean.setCronExpression('*/5 * * * * ?'); quartzJobService.createScheduleJobCron(quartzBean); } catch (Exception e) { return '創建失敗'; } return '創建成功'; } /** * 暫停job * @return */ @RequestMapping(value = {'/pauseJob/{jobName}','/pauseJob/{jobName}/{jobGroup}'}) @ResponseBody public String pauseJob(@PathVariable('jobName') String jobName,@PathVariable(required = false) String jobGroup) { try { quartzJobService.pauseScheduleJob(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); } catch (Exception e) { return '暫停失敗'; } return '暫停成功'; } @RequestMapping(value = {'/resume/{jobName}','/resume/{jobName}/{jobGroup}'}) @ResponseBody public String resume(@PathVariable('jobName') String jobName,@PathVariable(required = false) String jobGroup) { try { quartzJobService.resumeScheduleJob(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); } catch (Exception e) { return '啟動失敗'; } return '啟動成功'; } @RequestMapping(value = {'/delete/{jobName}','/delete/{jobName}/{jobGroup}'}) public String delete(@PathVariable('jobName') String jobName,@PathVariable(required = false) String jobGroup) { try { quartzJobService.deleteScheduleJob(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); } catch (Exception e) { return '刪除失敗'; } return '刪除成功'; } @RequestMapping(value = {'/check/{jobName}','/check/{jobName}/{jobGroup}'}) public String check(@PathVariable('jobName') String jobName,@PathVariable(required = false) String jobGroup) { try { if(quartzJobService.checkExistsScheduleJob(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null)){return '存在定時任務:'+jobName; }else{return '不存在定時任務:'+jobName; } } catch (Exception e) { return '查詢任務失敗'; } } @RequestMapping(value = {'/status/{jobName}','/status/{jobName}/{jobGroup}'}) @ResponseBody public String status(@PathVariable('jobName') String jobName,@PathVariable(required = false) String jobGroup) { try { return quartzJobService.getScheduleJobStatus(jobName,ObjectUtils.isNotEmpty(jobGroup) ?jobGroup:null); } catch (Exception e) { return '獲取狀態失敗'; } //return '獲取狀態成功'; }}

測試http://localhost:8080/api/quartz/startSimpleJob

到此這篇關于Springboot2.x+Quartz分布式集群的實現的文章就介紹到這了,更多相關Springboot2.x Quartz分布式集群內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 日韩精品一区二区三区中文在线 | 五月激情综合 | 人妖天堂狠狠ts人妖天堂狠狠 | 日韩精品一区二区三区在线 | 成人一级黄色大片 | 久久综合入口 | 亚洲精品久久久久久久久久久 | 久久久久久久国产精品视频 | 亚洲精品乱码久久久久久不卡 | 日韩国产精品视频 | 夜夜夜久久久 | www.久久 | 韩国久久精品 | 色综合天天综合网国产成人网 | 亚洲精选一区 | 99精品国产高清在线观看 | 自拍视频网 | 亚洲成人免费在线 | 国产成人免费视频网站视频社区 | 欧美日韩三级在线 | 国产精品高清在线 | 午夜精品久久久久 | 99精品热 | 国产成人精品久久二区二区 | 欧美99| 欧美一区二区三区久久精品 | 99re在线观看| 国产一区二区高潮 | 玖玖国产精品视频 | 91精品一区二区三区久久久久久 | 亚洲精品视频在线看 | 一区在线播放 | 久久免费精品 | 国产精品a一区二区三区网址 | 国产成人精品亚洲777人妖 | 日韩经典一区 | 国产精品久久久一区二区 | 欧美久久久久 | 中文字幕日韩专区 | 激情欧美一区二区 | 国产精品久久毛片 | 欧美国产日韩在线 | 四虎影音 | 亚洲一区二区三区在线观看免费 | 亚洲视频在线免费观看 | 日韩一区二区久久 | 国产精品成人久久久久 | 久久久久亚洲一区二区三区 | 欧美一区二区三区在线观看 | 91在线视频观看 | 91一级 | 国产xvideos免费视频播放 | 一本久久a久久精品亚洲 | 免费v片 | 91av国产在线视频 | 国产成人精品高清久久 | 涩涩视频在线观看 | 成人性大片免费观看网站 | 欧美日韩精品综合 | 久久久久久午夜 | 少妇久久久久 | 中国电影黄色一级片免费观看 | 精产国产伦理一二三区 | 精品国产一区二区三区成人影院 | 天天网 | 亚洲免费网站在线观看 | 亚洲精品四区 | 中文字幕亚洲欧美 | 久久精品系列 | 久久成人在线视频 | 久久亚洲精品国产精品紫薇 | 国产大片在线观看 | 欧美在线观看视频 | 久久精品99| 成人精品鲁一区一区二区 | 91中文在线| 午夜天堂精品久久久久 | 亚洲一区二区高清视频 | 日韩字幕一区 | 国产高清在线精品一区二区三区 | 精品久久精品 | 亚洲成人激情在线观看 | 成人a在线 | 青娱乐网 | 91久久精品国产 | 国产精选视频 | 日韩免费一区二区 | 国产精品1区2区 | 国产乱码精品一区二区三区av | 成人欧美一区二区三区在线观看 | 国产伦一区 | 久久爱综合 | 亚洲无吗电影 | 91看片淫黄大片一级在线观看 | 亚洲欧美国产精品久久久久 | 国产精品视频不卡 | 国产精品视频入口 | 久久av资源| 99r在线| 成人欧美一区二区三区在线播放 | 欧美日韩国产在线 | 成人av福利 | 国产区免费在线观看 | 久久中文字幕一区二区三区 | 国产精品久久777777 | 99福利视频 | 在线欧美亚洲 | 天天干在线影院 | 久久成人18免费网站 | 国产成在线观看免费视频 | 亚洲aⅴ网站 | 日韩欧美一区二区视频 | 亚洲国产精品久久久男人的天堂 | 亚洲精品乱码久久久久久不卡 | 中文字幕永久第一页 | 国产精品欧美一区二区三区 | 国产成人精品一区二区三区网站观看 | 色综合久| 国产精品揄拍一区二区久久国内亚洲精 | 99在线免费视频 | 欧美一区二区三区视频 | 免费av在线| 成人午夜性a一级毛片免费看 | 97国产一区二区精品久久呦 | 国产激情一区二区三区 | 日本不卡免费新一二三区 | 国产美女在线观看 | 久草成人| 日韩欧美在线免费观看 | 欧美一区在线看 | 色先锋资源| 美日韩精品视频 | 午夜午夜精品一区二区三区文 | 欧美一级电影免费观看 | 成人在线视频观看 | 欧美人牲 | 成人在线播放 | 国产精品欧美一区二区三区 | 国产精品久久久久久婷婷天堂 | 日韩日b视频 | 亚洲xx在线 | 欧美日韩激情一区二区三区 | 日本理伦片午夜理伦片 | 久久久精品欧美 | 久久精品伊人 | 日韩欧美在线视频观看 | 成人国产精品视频 | 一区二区三区国产 | 超碰在线看| 久久不色 | 在线免费视频成人 | 日韩小视频在线播放 | 在线日韩欧美 | 色综合欧美 | 爱免费视频 | 亚洲精品自在在线观看 | 91亚洲精品在线观看 | a级性生活 | 亚洲精品一区二区三区蜜桃久 | 五月天婷婷激情视频 | 国产免费看 | 一区二区三区四区久久 | caoporn免费| 一级黄色片视频 | 久久久99日产 | 日韩成人精品在线观看 | 国产成人综合一区二区三区 | 国产一区二区三区免费 | 成人免费毛片嘿嘿连载视频 | www.五月婷婷| 第一福利丝瓜av导航 | 成人午夜免费网站 | 国产中文在线播放 | 精品久久久久久久 | 亚洲欧美激情精品一区二区 | 日本另类αv欧美另类aⅴ | 国产一级片播放 | 色视频网站在线观看 | 在线视频a | 欧美黄色a视频 | 亚洲综合在线视频 | 欧美伦理一区二区三区 | 国产精品99久久久久久大便 | 91免费看 | 成人欧美一区二区三区黑人孕妇 | 成人一级黄色大片 | 欧美黑人狂躁日本寡妇 | 久久久久久av | 成人免费在线观看视频 | 亚洲一区二区三区在线免费观看 | 亚洲依人 | 久久久网 | 国产精品国产三级国产aⅴ 精品91 | 精品一区二区三区免费 | 一区二区三区视频在线免费观看 | 国产精国产精品 | 探花在线观看 | 久久成人一区 | 99在线看 | 色爱av | 韩国精品视频在线观看 | 日韩免费高清视频 | 欧美一区二区三区黄色 | 成人免费av| av网站免费| 国产视频久久久久久久 | 91亚洲狠狠婷婷综合久久久 | 91亚洲视频| 国产成人黄色 | 欧美日韩精品久久 | 亚洲精品福利在线 | av日韩在线播放 | 精品欧美一区二区三区久久久 | 亚洲精品国产高清 | 成人免费小视频 | 久久久性色精品国产免费观看 | 成人久久久久 | 亚洲视频在线看 | 国产 一区 | 日韩在线免费观看网站 | 欧美一区二区在线播放 | 久久久精彩视频 | 亚洲午夜在线 | 伊人草| 日韩电影在线一区 | 日韩欧美一区二区三区视频 | 久久av黄色 | 日日爽 | 2020亚洲视频 | 中文字幕在线第一页 | 蜜桃comaaa| 亚洲成人网络 | 三级黄色片在线 | 免费在线观看一区二区 | 欧美日本国产一区 | 美女天堂网 | 久久亚洲一区 | 亚洲精品在线播放 | 999久久久国产999久久久 | 色综合欧美 | 在线免费观看黄色 | 欧美怡红院视频一区二区三区 | 久草视频播放 | 天堂中文视频在线观看 | 综合久久网 | av不卡电影在线观看 | 国产精品中文 | av一区在线观看 | 亚洲精品一区二区网址 | 国产成人高清视频 | www.99re| 欧美成人综合在线 | 国产成人福利在线观看 | 亚洲精品视频在线播放 | 日韩一二三四 | 精品国产鲁一鲁一区二区在线观看 | 国产精品a免费一区久久电影 | 国产精品久久久久久久久久 | 国产成人精品亚洲777人妖 | 另类一区 | 狠狠爱www人成狠狠爱综合网 | 国产成人精品午夜视频免费 | 日韩精品观看 | 亚洲综合国产 | 一级免费毛片 | 成人在线手机版视频 | 国产日韩精品在线 | 久久91精品 | av在线大全 | 一级高清| 最新国产在线视频 | 五月综合久久 | 黄色大片网站在线观看 | 午夜影院男女 | 午夜精品久久久久久久久久久久久 | 在线干 | 91资源在线 | 黄色片视频在线观看 | 国产日韩一区 | 亚洲高清视频一区 | 99爱免费视频 | 日韩中文在线 | 亚洲国产高清视频 | 极品女神高潮呻吟av久久 | 国产婷婷精品av在线 | 伊人免费网 | 国产精品视频久久久 | 中文字幕亚洲欧美 | 欧美小电影 | 免费视频爱爱太爽了 | h视频网站在线 | 亚洲视频在线观看免费 | 国内精品成人 | 日韩一级免费观看 | 日本免费黄色 | 免费看毛片网 | 狠狠综合 | 欧美日韩二区三区 | 精品九九久久 | 人人爽日日爽 | 国产一区在线免费观看 | 宅男lu666噜噜噜在线观看 | 91视频在线播放视频 | 国产成人在线电影 | 免费一级 国产 | 亚洲视频中文字幕 | 日韩欧美国产一区二区三区 | 国产一区二区影院 | 亚洲精品一区中文字幕乱码 | 午夜亚洲一区 | 亚洲免费精品 | 国产成人av在线 | 国产一区久久 | 亚洲精品3 | 精品国产污网站污在线观看15 | 天天看天天摸天天操 | 亚洲精品久久久 | 日韩成人免费在线 | 久久国产精品无码网站 | 久久综合电影 | 免费观看在线午夜影视 | 亚洲444kkkk在线观看最新 | 成人精品| 精品国产天堂 | 日韩国产在线 | 九九国产精品视频 | 久久国产一区二区三区 | 久在线视频 | 国产成人午夜 | 国内精品久久久久国产 | 日韩精品久久久 | 亚洲成人基地 | 一区二区久久 | 午夜精品一区二区三区在线观看 | 91精品国产91久久久久久吃药 | 欧美国产精品一区 | 久久久久久一区 | 亚洲免费人成在线视频观看 | 精品久久久久久久久久久 | 久久亚洲一区二区三区四区五区高 | 96自拍视频 | 欧美高清视频一区 | 福利片在线| 国产一级免费视频 | 午夜影院在线 | 欧美性一区二区 | 午夜成人免费视频 | 国产精品爱久久久久久久 | 亚洲一区中文字幕 | 特黄av| 国产精品视频一区二区三区四 | 久久综合九色综合欧美狠狠 | 欧美精品亚洲 | 成av在线| 成人精品久久 | h在线看 | 91视频8mav| 国产一区二区三区四区 | 亚洲成人伦理 | 国产亚洲精品精品国产亚洲综合 | 日韩精品一二区 | 91干在线观看 | 91看片淫黄大片一级在线观看 | 99精品国产在热久久 | 欧美日韩国产在线观看 | 91精品久久久久久久久久入口 | 久久三区| 一色屋精品久久久久久久久久 | av性色| 国产精品美女久久久久久久久久久 | 伊人干综合 | 欧美国产日韩在线 | 日本在线网 | 91精品国产欧美一区二区 | 精品国产91亚洲一区二区三区www | 欧美a区 | 欧美激情一区二区三区在线观看 | 亚洲日本欧美 | 欧美日韩免费一区二区三区 | 日韩成人免费 | 一区二区三区免费网站 | 久久成人精品 | 久久久久久久久99精品 | 亚洲欧美一区二区三区在线 | 亚洲国产日韩欧美 | 一区二区三区成人久久爱 | 成人午夜视频在线观看 | 日本三级中文在线电影 | 国产精品一区一区 | 国产一区日韩欧美 | 日韩1区3区4区第一页 | 亚洲精品日韩在线 | 亚洲视频在线观看 | 涩久久| 久久久久中文字幕 | 97成人在线视频 | 日韩手机在线观看 | 四虎久久精品 | 女同理伦片在线观看禁男之园 | 国产探花在线精品一区二区 | 国产黄色在线免费看 | 日韩中文字幕视频 | av午夜电影 | 亚洲男人天堂网 | xvideos视频| 国产一级一级国产 | 欧美一区二区三区精品 | 亚洲成熟少妇视频在线观看 | 91免费在线视频 | 国产精品一区二区av | www日韩 | 国产午夜精品一区二区 | 国产一级特黄视频 | www.亚洲成人 | 亚洲一区在线日韩在线深爱 | 国产精品久久久久久久久免费丝袜 | h视频网站在线 | 麻豆专区一区二区三区四区五区 | 在线国产一区二区 | 一区二区三区国产 | 亚洲国产成人久久综合一区,久久久国产99 | 毛片毛片毛片毛片 | 日韩在线观看中文字幕 | 精品久久久久久亚洲精品 | 国产二区在线播放 | 免费一区二区三区 | 国产精品成人一区二区三区夜夜夜 | 国产精品视频一区二区三区 | 亚洲国产一区二区在线 | 婷婷亚洲五月 | 99久久免费精品国产男女性高好 | 国产一区二区三区高清 | 天天夜碰日日摸日日澡 | 黄色国产大片 | 一区二区日本 | 国产成人在线播放 | 亚洲一区二区三区四区五区中文 | 91精品一区二区 | 久久国产精品一区 | 超碰激情| 国产精品久久久久久久久久东京 | 九九视频这里只有精品 | 国产一区二区三区在线看 | 国产高清精品一区 | 国产精品爱久久久久久久 | 黄色一级视频 | 日韩av电影免费 | 国产视频一区二区三区四区 | 欧美在线播放一区 | 欧美精品1区| 日批免费观看视频 | 日韩高清在线 | 日本一区二区三区四区不卡视频 | 国产三区精品 | 国产精品久久久久一区二区三区 | 嫩草91| 久久久久久国产一级毛片高清版 | 成人欧美一区二区三区白人 | 亚洲国产成人精品久久 | www国产成人免费观看视频,深夜成人网 | 欧美日韩免费在线 | 天天天干天天射天天天操 | 成人在线网址 | 久久精品亚洲精品国产欧美 | 国产一区二 | 国内精品视频一区二区三区 | 久久国产一区二区 | 亚洲狠狠爱 | 色婷婷一区二区三区 | 国产高清自拍 | 天堂欧美城网站 | 最新日韩在线观看视频 | www一起操| 亚洲天堂第一页 | 欧美日韩一区在线 | 在线欧美日韩 | 久久青青视频 | 亚洲一区二区在线视频 | 精品国产一区二区三区久久久蜜月 | 国产成人在线看 | 国产精品一区二区三区在线 | 久久蜜桃视频 | 国产精品国产成人国产三级 | 精品久久久久久国产 | 国产在线在线 | 久久美女| 欧美日韩在线观看一区二区三区 | 成人免费在线视频 | 中文字幕亚洲字幕一区二区 | 欧美日韩毛片 | japanhd熟睡侵犯 | 中文字幕在线免费播放 | 五月婷亚洲| 91精品一区二区 | 欧美久久免费 | 国产高清视频 | 99草草| 国产在亚洲 线视频播放 | 欧美一区二区三区免费在线观看 | 免费一级毛片 | 久久久久久久久免费视频 | 亚洲一区二区三区免费视频 | 在线观看免费黄色 | 久久久久国产一区二区三区 | 日韩一级免费观看 | 黄色在线免费观看 | 99久久免费精品国产男女性高好 | 成人深夜福利视频 | 亚洲小视频| 欧美日韩啪啪 | 国产精品久久国产精品 | 亚洲国产精品久久久久久女王 | 在线观看v片| 91社区在线观看高清 | av三级在线观看 | 国产精品高清一区二区 | 国产一区二区三区四区视频 | 91麻豆精品国产91久久久久久 | 午夜精品视频在线观看 | 成人亚洲区 | 国产精品xxxx| 一区二区三区高清 | 亚洲高清免费视频 | 日韩精品一区二区三区在线播放 | 亚洲污视频 | 欧美一区二区三区在线观看视频 | 偷拍自拍网站 | 久久精品在线 | 91九色视频在线 | av一区二区三区四区 | 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲精品久久久久久下一站 | 国产精选一区二区三区不卡催乳 | 久色成人 | 亚洲性人人天天夜夜摸 | 午夜一级片 | 日韩视频一二 | 九九免费视频 | 一区二区三区四区在线 | 久久99国产精品久久99大师 | 婷婷色国产偷v国产偷v小说 | 日韩久久网 | 国产精品国产三级国产aⅴ无密码 | 伊人网av| 深夜福利亚洲 | 欧美成人午夜视频 | 亚洲处破女| 国内精品国产成人国产三级粉色 | 一区二区三区视频免费在线观看 | 一区二区三区精品 | 国产欧美精品区一区二区三区 | 99免费在线观看视频 | 国产女人和拘做受视频 | 在线看免费观看日本 | 99视频免费播放 | 在线视频中文字幕 | 国产999精品久久久久 | 国产精品美女久久久久aⅴ国产馆 | 天天色av| 97视频在线免费观看 | 日韩av一区二区在线观看 | 九九热精品视频在线观看 | 97热在线 | 国精品一区 | 久久免费99精品久久久久久 | 日本一区二区三区四区 | 亚洲精品国产第一综合99久久 | 在线免费看黄视频 | 日韩福利片 | 在线观看av国产一区二区 | 精品国产乱码久久久久久久 | 婷婷在线视频 | 免费视频爱爱太爽了 | 国产中文字幕一区 | 成人免费视频网站在线观看 | 91久色 | 天堂资源在线 | 日韩中文字幕免费在线 | 久久久久久久 | 一区二区成人网 | 亚洲视频中文字幕 | 亚洲欧美日韩在线一区二区三区 | 亚洲国产精品99久久久久久久久 | 精品久久久久久 | 日韩精品在线播放 | 亚洲一区二区精品 | av网站推荐 | 婷婷色在线 | 青青草人人 | 国产精品人人做人人爽人人添 | 国产九九在线观看 | 亚洲区视频在线 | 久久国产精品久久久久久久久久 | 在线精品国产 | 欧美专区在线 | 久久午夜电影院 | 成人超碰在线 | 国产精品亚洲一区 | av高清在线免费观看 | 久久综合九色综合欧美狠狠 | 亚洲网站在线观看 | 亚洲一区二区三区免费 | 在线播放一区二区三区 | 国产精品久久久久久久久久妞妞 | www.99精品 | 亚洲视频在线播放 | 日本久久精品一区二区 | 1000部羞羞视频在线看视频 | 亚洲精品一区二区三区四区高清 | 精品久| 三级国产网站 | 做视频免费观看网站 | 色婷婷精品国产一区二区三区 | 国产精品毛片久久久久久 | 欧美激情在线免费观看 |