一、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. 零距离初体验uboot

    一.uboot配置编译步骤 1.开发板光盘的BSP 2.复制到虚拟机,tar -jxvf qt_x210v3_130807.tar.bz2 3.配置:make x210_sd_config 4.出现C ...

  2. Day 4 -E - Catenyms POJ - 2337

    A catenym is a pair of words separated by a period such that the last letter of the first word is th ...

  3. Java 用户输入

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  4. (八)微信小程序---获取定位信息chooseLocation

    微信小程序---获取定位信息  chooseLocation wxml <view bindtap="getlocalPath">{{localPath}}</v ...

  5. centos7安装google-chrome和chromedriver

    1.root用户下进入到etc/yum.repos.d目录下  [root@f7d6b9f2-1291-4d2f-8805-aef94deac9f7 yum.repos.d]# pwd  /etc/y ...

  6. 【php】PHP现代框架代表-Laravel框架核心技术特性

    一.php语言特点及发展现状 1.服务端脚本语言,自由度太大 ,一个业务逻辑可言写在模型里,控制器里,也可以单独封装成一个类,甚至可以嵌入到html里,这样势必会造成混乱,业务逻辑散落在各处,尤其对于 ...

  7. 网卡绑定多个ip

    现在我的树莓派上的wlan0的IP是192.168.31.237,之前通过双绞线连接时候eth0的ip是192.168.31.50 . 我就想啊,能不能把wlan0的ip设置成50.......... ...

  8. 2.13 ViewModel 使数据即使在后台被杀死数据也能存活

    操作程序如下: 主要是创建一个 SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活 MyVIewModel: package com.example. ...

  9. Django ORM中常用的字段类型以及参数配置

    一.数值型 AutoField对应int(11).自增主键,Django Model默认提供,可以被重写. BooleanField对应tinyint(1).布尔类型字段,一般用于记录状态标记. De ...

  10. 一百零二、SAP中ALV事件之十五,让ALV表格自动求和

    一.代码如下 二.运行之后,效果如图,表头多了一个求和符号E,最下面一行会列出求和的相关信息 完美