一、Quartz简介

主要做定时任务,即:在指定时间点或时间段,执行某项任务,可设置执行次数、时间间隔等。

二、Springcloud简介

对比传统的、庞大的、复杂的、以ssm或ssh为框架的web项目而言,springcloud显得格外轻巧,不错乱,易管理,至少模块清晰,功能明确。

三、Springcloud集成quartz

就个人理解,quartz可集成到某个功能模块,也可以单独做一个服务(功能模块),本文介绍的就是单独作为一个服务进行集成的(未开启集群)。

第一步:在已有的父工程下新建一个子工程(可有可无)

第二步:依赖

​    ​

第三步:配置

 /**
* @Title: MyJobFactory.java
* @Package com.ewp.data.controller.quartz
* @Description: 解决不能spring注入bean的问题
* @author zxj
* @date 2018年2月26日
* @version V1.0
*/
package com.ewp.data.config; import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component; /**
* @ClassName: MyJobFactory
* @Description: 解决不能spring注入bean的问题
* @author zxj
* @date 2018年2月26日
*
*/
@Component
public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory; @Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
 import java.io.IOException;
import java.util.Properties; import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean; /**
*
* @ClassName: QuartzConfig
* @Description: 配置任务调度中心(服务启动时启动)
* @author zxj
* @date 2018年2月26日
*
*/
@Configuration
public class QuartzConfig { @Autowired
private MyJobFactory myFactory; //自定义的factory @Value("${spring.datasource.url}")
private String url;// 数据源地址 @Value("${spring.datasource.username}")
private String userName;// 用户名 @Value("${spring.datasource.password}")
private String password;// 密码 @Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
try {
schedulerFactoryBean.setQuartzProperties(quartzProperties());
schedulerFactoryBean.setJobFactory(myFactory); //指向自建的调度工厂,用于解决方法类无法注入的问题
} catch (IOException e) {
e.printStackTrace();
}
return schedulerFactoryBean;
} @Bean
public Scheduler scheduler() throws IOException, SchedulerException {
Scheduler scheduler = schedulerFactoryBean().getScheduler();
scheduler.start();// 服务启动shi
return scheduler;
}
/**
*
* @Title: quartzProperties
* @Description: 设置quartz属性
* @param @return
* @param @throws IOException 参数
* @return Properties 返回类型
* @throws
*/
public Properties quartzProperties() throws IOException {
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "quartzScheduler");// 调度器的实例名
prop.put("org.quartz.scheduler.instanceId", "AUTO");// 实例的标识
prop.put("org.quartz.scheduler.skipUpdateCheck", "true");// 检查quartz是否有版本更新(true 不检查)
prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.StdJDBCDelegate");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");// 表名前缀
prop.put("org.quartz.jobStore.isClustered", "false");// 集群开关
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");// 线程池的名字
prop.put("org.quartz.threadPool.threadCount", "10");// 指定线程数量
prop.put("org.quartz.threadPool.threadPriority", "5");// 线程优先级(1-10)默认为5
prop.put("org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread", "true");
prop.put("org.quartz.jobStore.dataSource", "quartzDataSource"); prop.put("org.quartz.dataSource.quartzDataSource.driver", "com.mysql.jdbc.Driver");
prop.put("org.quartz.dataSource.quartzDataSource.URL", url);
prop.put("org.quartz.dataSource.quartzDataSource.user", userName);
prop.put("org.quartz.dataSource.quartzDataSource.password", password);
prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", "50");
return prop;
} }

第四步:建类(任务管理类)

 import java.io.Serializable;

 /**
*
* @ClassName: TaskInfo
* @Description: 管理定时任务
* @author zxj
* @date 2018年2月26日
*
*/
public class TaskInfo implements Serializable{
private static final long serialVersionUID = -8054692082716173379L; /**
* 增加或修改标识
*/
private int id; /**
* 任务名称
*/
private String jobName; /**
* 任务分组
*/
private String jobGroup; /**
* 任务描述
*/
private String jobDescription; /**
* 任务状态
*/
private String jobStatus; /**
* 任务表达式
*/
private String cronExpression; /**
* 创建时间
*/
private String createTime; /**
* 间隔时间(毫秒)
*/
private String milliSeconds; /**
* 重复次数
*/
private String repeatCount; /**
* 起始时间
*/
private String startDate; /**
* 终止时间
*/
private String endDate; /**
* @return the milliSeconds
*/
public String getMilliSeconds() {
return milliSeconds;
} /**
* @param milliSeconds the milliSeconds to set
*/
public void setMilliSeconds(String milliSeconds) {
this.milliSeconds = milliSeconds;
} /**
* @return the repeatCount
*/
public String getRepeatCount() {
return repeatCount;
} /**
* @param repeatCount the repeatCount to set
*/
public void setRepeatCount(String repeatCount) {
this.repeatCount = repeatCount;
} /**
* @return the startDate
*/
public String getStartDate() {
return startDate;
} /**
* @param startDate the startDate to set
*/
public void setStartDate(String startDate) {
this.startDate = startDate;
} /**
* @return the endDate
*/
public String getEndDate() {
return endDate;
} /**
* @param endDate the endDate to set
*/
public void setEndDate(String endDate) {
this.endDate = endDate;
} public String getJobName() {
return jobName;
} public void setJobName(String jobName) {
this.jobName = jobName;
} public String getJobGroup() {
return jobGroup;
} public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
} public String getJobDescription() {
return jobDescription;
} public void setJobDescription(String jobDescription) {
this.jobDescription = jobDescription;
} public String getJobStatus() {
return jobStatus;
} public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
} public String getCronExpression() {
return cronExpression;
} public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
} public String getCreateTime() {
return createTime;
} public void setCreateTime(String createTime) {
this.createTime = createTime;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
}
}

第五步:写方法(任务处理方法)

 package com.ewp.data.service;

 import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List; import org.apache.commons.lang3.time.DateFormatUtils;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import com.ewp.data.quartz.TaskInfo;
import com.ewp.data.quartz.exception.ServiceException;
import com.ewp.data.util.DateUtil; /**
*
* @ClassName: TaskService
* @Description: 任务处理类
* @author zxj
* @date 2018年2月26日
*
*/
@Service
public class TaskService {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskService.class); @Autowired
private Scheduler scheduler; /**
*
* @Title: list
* @Description: 任务列表
* @param @return 参数
* @return List<TaskInfo> 返回类型
* @throws
*/
public List<TaskInfo> queryJobList() {
LOGGER.info("TaskService--data-s-->queryJobList()");
List<TaskInfo> list = new ArrayList<>();
try {
for (String groupJob : scheduler.getJobGroupNames()) {
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.<JobKey> groupEquals(groupJob))) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
String cronExpression = "";
String createTime = "";
String milliSeconds = "";
String repeatCount = "";
String startDate = "";
String endDate = "";
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
cronExpression = cronTrigger.getCronExpression();
createTime = cronTrigger.getDescription();
} else if (trigger instanceof SimpleTrigger) {
SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;
milliSeconds = simpleTrigger.getRepeatInterval()+ "";
repeatCount = simpleTrigger.getRepeatCount() + "";
startDate = DateUtil.getDateStr(
simpleTrigger.getStartTime(),
DateUtil.FORMAT_HOUR_DATE_TIME);
endDate = DateUtil.getDateStr(simpleTrigger.getEndTime(),DateUtil.FORMAT_HOUR_DATE_TIME);
}
TaskInfo info = new TaskInfo();
info.setJobName(jobKey.getName());
info.setJobGroup(jobKey.getGroup());
info.setJobDescription(jobDetail.getDescription());
info.setJobStatus(triggerState.name());
info.setCronExpression(cronExpression);
info.setCreateTime(createTime); info.setRepeatCount(repeatCount);
info.setStartDate(startDate);
info.setMilliSeconds(milliSeconds);
info.setEndDate(endDate);
list.add(info);
}
}
}
LOGGER.info("任务的数量为:---------------->" + list.size());
} catch (SchedulerException e) {
LOGGER.info("查询任务失败,原因是:------------------>" + e.getMessage());
e.printStackTrace();
}
return list;
} /**
*
* @Title: setSimpleTrigger
* @Description: 简单调度
* @param @param inputMap
* @param @return 参数
* @return Boolean 返回类型
* @throws
*/
@SuppressWarnings({ "unchecked" })
public void setSimpleTriggerJob(TaskInfo info) {
LOGGER.info("TaskService--data-s-->setSimpleTriggerJob()" + info);
String jobName = info.getJobName();
String jobGroup = info.getJobGroup();
String jobDescription = info.getJobDescription();
Long milliSeconds = Long.parseLong(info.getMilliSeconds());
Integer repeatCount = Integer.parseInt(info.getRepeatCount());
Date startDate = DateUtil.parseDate(info.getStartDate());
Date endDate = DateUtil.parseDate(info.getEndDate());
try {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);// 触发器的key值
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);// job的key值
if (checkExists(jobName, jobGroup)) {
LOGGER.info(
"===> AddJob fail, job already exist, jobGroup:{}, jobName:{}",
jobGroup, jobName);
throw new ServiceException(String.format(
"Job已经存在, jobName:{%s},jobGroup:{%s}", jobName,
jobGroup));
}
/* 简单调度 */
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
.newTrigger()
.withIdentity(triggerKey)
.startAt(startDate)
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMilliseconds(milliSeconds)
.withRepeatCount(repeatCount))
.endAt(endDate).build();
Class<? extends Job> clazz = (Class<? extends Job>) Class
.forName(jobName);
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey)
.withDescription(jobDescription).build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException | ClassNotFoundException e) {
LOGGER.info("任务添加失败!--->简单调度" + e.getMessage());
throw new ServiceException("任务添加失败!--->简单调度");
}
} /**
*
* @Title: addJob
* @Description: 保存定时任务
* @param @param info 参数
* @return void 返回类型
* @throws
*/
@SuppressWarnings("unchecked")
public void addJob(TaskInfo info) {
LOGGER.info("TaskService--data-s-->addJob()" + info);
String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info
.getCronExpression(), jobDescription = info.getJobDescription(), createTime = DateFormatUtils
.format(new Date(), "yyyy-MM-dd HH:mm:ss");
try {
if (checkExists(jobName, jobGroup)) {
LOGGER.info(
"===> AddJob fail, job already exist, jobGroup:{}, jobName:{}",
jobGroup, jobName);
throw new ServiceException(String.format(
"Job已经存在, jobName:{%s},jobGroup:{%s}", jobName,
jobGroup));
} TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
JobKey jobKey = JobKey.jobKey(jobName, jobGroup); CronScheduleBuilder schedBuilder = CronScheduleBuilder
.cronSchedule(cronExpression)
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey).withDescription(createTime)
.withSchedule(schedBuilder).build(); Class<? extends Job> clazz = (Class<? extends Job>) Class
.forName(jobName);
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobKey)
.withDescription(jobDescription).build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException | ClassNotFoundException e) {
LOGGER.info("保存定时任务-->类名不存在或执行表达式错误--->复杂调度" + e.getMessage());
throw new ServiceException("类名不存在或执行表达式错误");
}
} /**
*
* @Title: edit
* @Description: 修改定时任务
* @param @param info 参数
* @return void 返回类型
* @throws
*/
public void editJob(TaskInfo info) {
LOGGER.info("TaskService--data-s-->editJob()" + info);
String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info
.getCronExpression(), jobDescription = info.getJobDescription(), createTime = DateFormatUtils
.format(new Date(), "yyyy-MM-dd HH:mm:ss");
try {
if (!checkExists(jobName, jobGroup)) {
throw new ServiceException(
String.format("Job不存在, jobName:{%s},jobGroup:{%s}",
jobName, jobGroup));
}
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
JobKey jobKey = new JobKey(jobName, jobGroup);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder
.cronSchedule(cronExpression)
.withMisfireHandlingInstructionDoNothing();
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity(triggerKey).withDescription(createTime)
.withSchedule(cronScheduleBuilder).build(); JobDetail jobDetail = scheduler.getJobDetail(jobKey);
jobDetail.getJobBuilder().withDescription(jobDescription);
HashSet<Trigger> triggerSet = new HashSet<>();
triggerSet.add(cronTrigger); scheduler.scheduleJob(jobDetail, triggerSet, true);
} catch (SchedulerException e) {
LOGGER.info("修改定时任务-->类名不存在或执行表达式错误--->复杂调度" + e.getMessage());
throw new ServiceException("类名不存在或执行表达式错误");
}
} /**
*
* @Title: delete
* @Description: 删除定时任务
* @param @param jobName
* @param @param jobGroup 参数
* @return void 返回类型
* @throws
*/
public void deleteJob(String jobName, String jobGroup) {
LOGGER.info("TaskService--data-s-->deleteJob()--jobName:" + jobName
+ "jobGroup:" + jobGroup);
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
try {
if (checkExists(jobName, jobGroup)) {
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
LOGGER.info("===> delete, triggerKey:{}", triggerKey);
}
} catch (SchedulerException e) {
LOGGER.info("删除定时任务-->复杂调度" + e.getMessage());
throw new ServiceException(e.getMessage());
}
} /**
*
* @Title: pause
* @Description: 暂停定时任务
* @param @param jobName
* @param @param jobGroup 参数
* @return void 返回类型
* @throws
*/
public void pauseJob(String jobName, String jobGroup) {
LOGGER.info("TaskService--data-s-->pauseJob()--jobName:" + jobName
+ "jobGroup:" + jobGroup);
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
try {
if (checkExists(jobName, jobGroup)) {
scheduler.pauseTrigger(triggerKey);
LOGGER.info("===> Pause success, triggerKey:{}", triggerKey);
}
} catch (SchedulerException e) {
LOGGER.info("暂停定时任务-->复杂调度" + e.getMessage());
throw new ServiceException(e.getMessage());
}
} /**
*
* @Title: resume
* @Description: 恢复暂停任务
* @param @param jobName
* @param @param jobGroup 参数
* @return void 返回类型
* @throws
*/
public void resumeJob(String jobName, String jobGroup) {
LOGGER.info("TaskService--data-s-->resumeJob()--jobName:" + jobName
+ "jobGroup:" + jobGroup);
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
try {
if (checkExists(jobName, jobGroup)) {
scheduler.resumeTrigger(triggerKey);
LOGGER.info("===> Resume success, triggerKey:{}", triggerKey);
}
} catch (SchedulerException e) {
LOGGER.info("重新开始任务-->复杂调度" + e.getMessage());
e.printStackTrace();
}
} /**
*
* @Title: checkExists
* @Description: 验证任务是否存在
* @param @param jobName
* @param @param jobGroup
* @param @return
* @param @throws SchedulerException 参数
* @return boolean 返回类型
* @throws
*/
private boolean checkExists(String jobName, String jobGroup)
throws SchedulerException {
LOGGER.info("TaskService--data-s-->checkExists()--jobName:" + jobName
+ "jobGroup:" + jobGroup);
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
return scheduler.checkExists(triggerKey);
} }

第六步:执行sql脚本

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS; CREATE TABLE QRTZ_JOB_DETAILS
(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
); CREATE TABLE QRTZ_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
); CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
); CREATE TABLE QRTZ_CRON_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
); CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
); CREATE TABLE QRTZ_BLOB_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
); CREATE TABLE QRTZ_CALENDARS
(
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
); CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
); CREATE TABLE QRTZ_FIRED_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID)
); CREATE TABLE QRTZ_SCHEDULER_STATE
(
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
); CREATE TABLE QRTZ_LOCKS
(
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);

第七步:编写自定义任务(需实现Job接口)

 /**
* @Title: ReportMailBatch.java
* @Package com.ewp.data.batch
* @Description: 邮件汇报批
* @author zxj
* @date 2018年2月26日
* @version V1.0
*/
package com.ewp.data.batch; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import com.ewp.data.service.ReportMailService; /**
* @ClassName: ReportMailBatch
* @Description: 邮件汇报批
* @author zxj
* @date 2018年2月26日
*
*/
@Component
public class ReportMailBatch implements Job{ private static final Logger log = LoggerFactory.getLogger(ReportMailBatch.class); @Autowired
private ReportMailService service; @Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
log.info("ReportMailBatch--data-c->execute()");
service.sendReportMail();// 可换成自己业务逻辑
log.info("--本次邮件汇报批处理结束--");
}
}

第八步:创建任务处理controller注入TaskService,将第七步编写的任务加入调度器,由线程调用执行。

maven项目集成Quartz定时任务框架,实现批处理功能的更多相关文章

  1. (2)Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  2. Spring集成Quartz定时任务框架介绍和Cron表达式详解

    原文地址:http://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html 在JavaEE系统 ...

  3. Spring_Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  4. Spring集成Quartz定时任务框架介绍

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  5. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

    项目结构:   1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  6. Spring Boot 入门(九):集成Quartz定时任务

    本片文章续<Spring Boot 入门(八):集成RabbitMQ消息队列>,关于Quartz定时任务请参考<Quartz的基本使用之入门(2.3.0版本)> spring ...

  7. spring boot 集成 quartz 定时任务

    spring boot: @EnableScheduling开启计划任务支持,@Scheduled计划任务声明 1.pom.xml 引入依赖 <dependency> <groupI ...

  8. 如何搭建maven项目和搭建ssm框架

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

  9. 使用IDEA 创建Maven项目,外加SSM框架

    使用idea 新创建项目 然后 新创建 java .resources 文件夹...... 图上是项目结构 java文件夹下的 文件夹 命名规范 com.nf147(组织名)+ oukele(作者) ...

随机推荐

  1. vue axios的跨域前后端解决方案

    原因出于安全考虑,浏览器有一个同源策略.浏览器中,异步请求的地址与目标地址的协议.域名和端口号三者与当前有不同,就属于跨域请求. 限制跨域访问是浏览器的一个安全策略,因为如果没有这个策略,那么就有被跨 ...

  2. Day4-T3

    原题目 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散 落民间几百年的珍宝——月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工 匠们用金线连 ...

  3. Spring Boot2(004):关于 Build Systems (构建系统)

    Spring Boot Ref 建议使用 maven 或者 gradle 来进行依赖管理和应用构建. 一.Dependency Management(依赖管理) Spring Boot 的每个版本都会 ...

  4. spring mvc绑定参数之日期类型转换

    问题复现步骤: 1.提交表单,参数为: 2.接收参数类型为product实体类,如下 3.错误日志如下: org.springframework.validation.BindException: o ...

  5. 数论 CF27E Number With The Given Amount Of Divisors

    求因子数一定的最小数(反素数) #include<iostream> #include<string> #include<cmath> #include<cs ...

  6. 浅谈Python之sys.argv

    (1)sys.argv是什么 sys模块为进入解释器维护或使用的变量,以及与解释器相关的函数提供了途径.sys.argv在脚本程序中扮演了这样一个角色:将命令行输入的参数作为一个list传入脚本程序, ...

  7. Java文件处理之IO流

    一.概述 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象 :其作用是为数据源和目的地建立一个输送通道. IO流:是程序中一套用于数据传输的机制.IO流是Input流和Outpu ...

  8. 逆向-PE头解析

    目录 PE头解析 数据结构 IMAGE_DOS_HEADER IMAGE_NT_HEADERS 区块 PE头解析 PE 格式是Windows系统下组织可执行文件的格式.PE文件由文件头和对应的数据组成 ...

  9. Nginx php-fpm 分离搭建 (上) 未完

    最近又重新看了一遍   'nginx入门到精通'      抽点时间 出来搭几个Demo  会有更深体会: Nginx如何与Php-fpm结合 Nginx不只有处理http请求的功能,还能做反向代理. ...

  10. com.alibaba.druid.pool.DruidDataSource

    https://www.cnblogs.com/wuyun-blog/p/5679073.html DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PR ...