quartz 定时调度实现
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
1.页面提供一个功能供用户设置自己的scheduler时间定时发送邮件对应把存储信息存入到数据库.
2.封装job具体信息对象 JobInfoVo
private Integer jobId; private String jobName; private String groupName; private String triggerName; private String triggerGroupName; private String cronExpression; private String targetObject; private String targetMethod; private Integer targetSubId; private Integer jobStatus; private String createId; private String updateId; private Timestamp createDate; private Timestamp updateDate;
3.封装获取job具体信息JobDao
ArrayList<JobInfoVo> list = new ArrayList<>(); Connection con = null; Statement stmt = null; ResultSet rs = null; try { con = JDBCUtil.getConnection(); con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); stmt = con.createStatement(); rs = stmt.executeQuery(GET_ALL_JOBS_SQL); while (rs.next()) { JobInfoVo job = new JobInfoVo(); job.setJobId(rs.getInt(1)); job.setJobName(rs.getString(2)); job.setGroupName(rs.getString(3)); job.setTriggerName(rs.getString(4)); job.setTriggerGroupName(rs.getString(5)); job.setCronExpression(rs.getString(6)); job.setTargetObject(rs.getString(7)); job.setTargetMethod(rs.getString(8)); job.setTargetSubId(rs.getInt(9)); job.setJobStatus(rs.getInt(10)); job.setCreateId(rs.getString(11)); job.setCreateDate(rs.getTimestamp(12)); job.setUpdateId(rs.getString(13)); job.setUpdateDate(rs.getTimestamp(14)); list.add(job); } } finally { JDBCUtil.closeResource(con, stmt, rs); }
4. 重写org.quartz.Job接口唯一的方法execute(),在这个方法里面写要定时执行的代码。
public void execute(JobExecutionContext context){
Map<String,JobInfoVo> jobInfos = JobService.getAllJobInfo()
JobKey jobKey = context,getJobDetails().getKey();
String jobName = jobKey.getName();
if(jobName == null){
return;
}
JobInfoVo jobInfo = jobInfos,get(jobName);
// jobInfo.getTargetObject() 就是对应要执行的类
Class clazz = Class.forName(jobInfo.getTargetObject());
//对应类里面要执行的方法
Method m = clazz.getDeclareMethod(jobInfo.getTargetMethod(),Integer.class,String.class);
// 方法中需要用到的参数
m.invoke(clazz.newInstance(),jobInfo.getTargetSubId(),jobName);
}
5. 然后创建scheduler->创建JobDetail的实例指定执行哪个job->创建一个Trigger实例指定执行时间->最后将哪个job由哪个trigger触发安排设置进调度程序-任务执行计划表并启动它
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
public static void addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,Class<? extends Job> jobClass,String cron){
Scheduler scheduler = gSchedulerFactory.getScheduler();
if (!scheduler.isShutdown()) {
scheduler.start();
}
JobKey jobkey = new JobKey(jobName, jobGroupName);
if (!scheduler.checkExists(jobkey)) {
JobDetail job = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroupName).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroupName).startNow()
.withSchedule(CronScheduleBuilder.cronSchedule(cron))
.build();
scheduler.scheduleJob(job, trigger);
}
}
public static void removeJob(String jobName, String jobGroupName) throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
JobKey jobkey = new JobKey(jobName, jobGroupName);
JobDetail jobDetail = sched.getJobDetail(jobkey);
if (jobDetail == null)
return;
sched.pauseJob(jobkey);
sched.deleteJob(jobkey);
}
6.