首页
IT
登录
6mi
u
盘
搜
搜 索
IT
springmvc结合quartz实现定时任务
springmvc结合quartz实现定时任务
xiaoxiao
2021-12-14
19
一、问题背景
在我们实际开发项目的过程中,经常需要在某一个时刻自动触发一个任务定时提取一些业务数据或者报表。比如,客户希望在每天晚上的某个时点将业务数据提取到某一个表中,并且生成新的报表。基于这种情况,我们使用quartz来实现任务的自动运行
二、代码实现
任务监听类:TaskFilter.java
Java代码
import
java.text.SimpleDateFormat;
import
java.util.ArrayList;
import
java.util.Date;
import
java.util.Iterator;
import
java.util.List;
import
org.quartz.CronTrigger;
import
org.quartz.JobDataMap;
import
org.quartz.JobDetail;
import
org.quartz.Scheduler;
import
org.quartz.SchedulerException;
import
org.quartz.SchedulerFactory;
import
org.quartz.impl.StdSchedulerFactory;
import
org.springframework.beans.factory.InitializingBean;
import
org.springframework.expression.ParseException;
import
org.springframework.stereotype.Repository;
import
com.ssm.job.domain.JobPlanDomain;
@Repository
(
"taskFilter"
)
public
class
TaskFilter
implements
InitializingBean {
// 0 0 12 * * ? 每天12点整触发一次
// 0 15 10 ? * * 每天10点15分触发一次
// 0 15 10 * * ? 每天10点15分触发一次
// 0 15 10 * * ? * 每天10点15分触发一次
// 0 15 10 * * ? 2005 2005年内每天10点15分触发一次
// 0 * 14 * * ? 每天的2点整至2点59分,每分钟触发一次
// 0 0/5 14 * * ? 每天的2点整至2点55分,每5分钟触发一次
// 0 0/5 14,18 * * ? 每天的2点整至2点55分以及18点整至18点55分,每5分钟触发一次
// 0 0-5 14 * * ? 每天的2点整至2点5分,每分钟触发一次
// 0 10,44 14 ? 3 WED 每年3月的每个星期三的2点10分以及2点44分触发一次
// 0 15 10 ? * MON-FRI 每月周一、周二、周三、周四、周五的10点15分触发一次
// 0 15 10 15 * ? 每月15的10点15分触发一次
// 0 15 10 L * ? 每月最后一天的10点15分触发一次
// 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次
// 0 15 10 ? * 6L 每月最后一个周五的10点15分触发一次
// 0 15 10 ? * 6L 2002-2005 2002年至2005年间,每月最后一个周五的10点15分触发一次
// 0 15 10 ? * 6#3 每月第三个周五的10点15触发一次
// 0 0 12 1/5 * ? 每月1号开始,每5天的12点整触发一次
//
// 0 11 11 11 11 ? 每年11月11日11点11分触发一次
/**
* 容器启动时初始化该类时,将任务都加到内存当中
*
* @throws SchedulerException
* @throws ParseException
*/
public
void
initJobTrigger()
throws
SchedulerException, ParseException {
SchedulerFactory schedulerFactory =
new
StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 这里可以读取数据库来设置各个任务
List list =
new
ArrayList();
JobPlanDomain t1 =
new
JobPlanDomain();
t1.setCronExpression(
"* * * * * ?"
);
t1.setValid(
"0"
);
t1.setJobPlanCode(
"222222222222"
);
list.add(t1);
if
(
null
!= list && list.size() >
0
) {
Iterator ite = list.iterator();
while
(ite.hasNext()) {
// 任务对象
JobPlanDomain rj = (JobPlanDomain) ite.next();
// 任务表达式
String cronExpression = rj.getCronExpression();
// 新建任务,任务组为默认的Scheduler.DEFAULT_GROUP,需要执行的任务类为TaskReport.class
JobDetail jobDetail =
new
JobDetail(
"reportJob_"
+ rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP, TaskReport.
class
);
// 新建触发器,触发器为默认的Scheduler.DEFAULT_GROUP
CronTrigger cronTrigger =
new
CronTrigger(
"trigger_"
+ rj.getJobPlanCode(), Scheduler.DEFAULT_GROUP);
JobDataMap jobDataMap =
new
JobDataMap();
jobDataMap.put(
"managecom"
,
"8611"
);
jobDataMap.put(
"wageno"
,
"201409"
);
jobDetail.setJobDataMap(jobDataMap);
try
{
// 为触发器设置定时表达式
cronTrigger.setCronExpression(cronExpression);
String startTime =
"2014-10-17 16:17:10"
;
String endTime =
"2014-10-17 16:17:50"
;
SimpleDateFormat sdf=
new
SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss"
);
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
if
(startTime.compareTo(endTime) >
0
) {
throw
new
Exception(
"起始时间比结束时间大!"
);
}
cronTrigger.setStartTime(startDate);
cronTrigger.setEndTime(endDate);
// 启动新增定时器任务
scheduler.scheduleJob(jobDetail, cronTrigger);
}
catch
(Exception e) {
// 启动验证失败,设置任务标记为禁用
e.printStackTrace();
rj.setValid(
"1"
);
// baseDao.updateObject(rj);
}
}
}
// 初始化任务只需要执行一次,执行一次后移除初始化触发器
scheduler.unscheduleJob(
"InitTrigger"
, Scheduler.DEFAULT_GROUP);
// 任务启动
scheduler.start();
}
public
static
void
main(String[] args) {
TaskFilter t =
new
TaskFilter();
try
{
t.initJobTrigger();
}
catch
(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
void
afterPropertiesSet()
throws
Exception {
try
{
this
.initJobTrigger();
}
catch
(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
任务计划类:JobPlanDomain.java
Java代码
public
class
JobPlanDomain {
//任务编号
private
String jobCode;
//任务计划编号
private
String jobPlanCode;
//任务启动时间表达式
private
String cronExpression;
//任务启动状态 0 未启动 1 启动
private
String runState;
//任务是否有效 0 有效 1 无效
private
String valid;
//任务参数
private
String paramMap;
//任务执行次数
private
int
count;
//下次任务启动时间,适用于任务启动多次
private
String nextRunTime;
//任务开始时间
private
String startDateTime;
//任务结束时间
private
String endDateTime;
//执行频率,1、每天一次 2、每年一次 3、每小时一次 4、每周一次
private
int
frequence;
//任务运行的节点和端口号
private
String ip;
//任务定制人
private
String operator;
//任务定制日期
private
String makeDate;
//任务定制时间
private
String makeTime;
//任务修改日期
private
String modifyDate;
//任务修改时间
private
String modifyTime;
public
String getJobCode() {
return
jobCode;
}
public
void
setJobCode(String jobCode) {
this
.jobCode = jobCode;
}
public
String getJobPlanCode() {
return
jobPlanCode;
}
public
void
setJobPlanCode(String jobPlanCode) {
this
.jobPlanCode = jobPlanCode;
}
public
String getCronExpression() {
return
cronExpression;
}
public
void
setCronExpression(String cronExpression) {
this
.cronExpression = cronExpression;
}
public
String getValid() {
return
valid;
}
public
void
setValid(String valid) {
this
.valid = valid;
}
public
int
getCount() {
return
count;
}
public
void
setCount(
int
count) {
this
.count = count;
}
public
String getStartDateTime() {
return
startDateTime;
}
public
void
setStartDateTime(String startDateTime) {
this
.startDateTime = startDateTime;
}
public
String getEndDateTime() {
return
endDateTime;
}
public
void
setEndDateTime(String endDateTime) {
this
.endDateTime = endDateTime;
}
public
String getIp() {
return
ip;
}
public
void
setIp(String ip) {
this
.ip = ip;
}
public
String getOperator() {
return
operator;
}
public
void
setOperator(String operator) {
this
.operator = operator;
}
public
String getMakeDate() {
return
makeDate;
}
public
void
setMakeDate(String makeDate) {
this
.makeDate = makeDate;
}
public
String getMakeTime() {
return
makeTime;
}
public
void
setMakeTime(String makeTime) {
this
.makeTime = makeTime;
}
public
String getModifyDate() {
return
modifyDate;
}
public
void
setModifyDate(String modifyDate) {
this
.modifyDate = modifyDate;
}
public
String getModifyTime() {
return
modifyTime;
}
public
void
setModifyTime(String modifyTime) {
this
.modifyTime = modifyTime;
}
public
String getNextRunTime() {
return
nextRunTime;
}
public
void
setNextRunTime(String nextRunTime) {
this
.nextRunTime = nextRunTime;
}
public
void
setParamMap(String paramMap) {
this
.paramMap = paramMap;
}
public
String getRunState() {
return
runState;
}
public
void
setRunState(String runState) {
this
.runState = runState;
}
public
int
getFrequence() {
return
frequence;
}
public
void
setFrequence(
int
frequence) {
this
.frequence = frequence;
}
public
String getParamMap() {
return
paramMap;
}
}
任务实现类:TaskReport.java
Java代码
import
java.util.Iterator;
import
java.util.Set;
import
org.quartz.Job;
import
org.quartz.JobDataMap;
import
org.quartz.JobDetail;
import
org.quartz.JobExecutionContext;
import
org.quartz.JobExecutionException;
public
class
TaskReport
implements
Job {
/**
* 报表生成任务
*/
@Override
public
void
execute(JobExecutionContext je)
throws
JobExecutionException {
System.out.println(je.getJobDetail().getKey());
System.out.println(je.getJobDetail().getJobClass());
JobDetail jobDetail = je.getJobDetail();
JobDataMap jobData = jobDetail.getJobDataMap();
Set tjobSet = jobData.keySet();
Iterator tIterator = tjobSet.iterator();
while
(tIterator.hasNext()) {
String key = (String)tIterator.next();
System.out.println(jobData.get(key));
}
}
}
三、将quartz.properties放到web工程classpath中
quartz.properties:
Java代码
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export =
false
org.quartz.scheduler.rmi.proxy =
false
org.quartz.scheduler.wrapJobExecutionInUserTransaction =
false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.
class
= org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =
10
org.quartz.threadPool.threadPriority =
5
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread =
true
#============================================================================
# Configure JobStore
#============================================================================
#org.quartz.jobStore.
class
= org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.misfireThreshold =
60000
#org.quartz.jobStore.useProperties =
false
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.isClustered =
true
#org.quartz.jobStore.clusterCheckinInterval =
15000
#============================================================================
# Configure DataSource
#============================================================================
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#org.quartz.dataSource.myDS.URL = jdbc:mysql:
//localhost/test
#org.quartz.dataSource.myDS.user = root
#org.quartz.dataSource.myDS.password = root
#org.quartz.dataSource.myDS.maxConnections =
10
四、运行类TaskFilter.java
运行前请修改TaskFilter.java中的时间。
控制台会依次打印出:
DEFAULT.reportJob_222222222222
class com.ssm.job.TaskReport
201409
8611
转载请注明原文地址: https://ju.6miu.com/read-963959.html
专利
最新回复
(
0
)