选用Quartz进行开发,用oracle进行持久化。来实现页面新增、查看定时任务等功能。
1、首先需要建立Quratz所需要的数据库表结构,借鉴博主:四夕月的文章 https://www.cnblogs.com/yueUyueMe/p/14648751.html。
2、配置quartz.properties配置文件。
#调度器名称
org.quartz.scheduler.instanceName = TechheroScheduler
#如果使用集群,instanceId必须唯一,设置成AUTO
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 1
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#表示实际执行时间与下一次应该执行时间之间的差值,超过这个差值就不会弥补执行,低于这个差值就会弥补执行
org.quartz.jobStore.misfireThreshold = 5000
#是否使用集群
org.quartz.jobStore.isClustered = true
# jobStore 持久化配置
#存储方式使用JobStoreTX,也就是数据库
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 使用quartz.properties,不使用默认配置
org.quartz.jobStore.useProperties = false
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix = QRTZ_
#配置数据源
#org.quartz.jobStore.dataSource = qzDS
#org.quartz.dataSource.qzDS.provider = hikaricp
#org.quartz.dataSource.qzDS.driver = oracle.jdbc.driver.OracleDriver
#org.quartz.dataSource.qzDS.URL = jdbc:oracle:thin:@47.104.80.42:521:orcl
#org.quartz.dataSource.qzDS.user = cloud2
#org.quartz.dataSource.qzDS.password = root
#org.quartz.dataSource.qzDS.validationQuery = select 1 from dual
3、创建定时任务的实体类来记录定时任务的信息。
@EqualsAndHashCode(callSuper = false)
@Data
public class JobConfigDTO implements Serializable {
private static final long serialVersionUID = -9046008904285626159L;
@ApiModelProperty(value = "任务名称")
private String jobName;
@ApiModelProperty(value = "任务所属组")
private String groupName;
@ApiModelProperty(value = "任务执行类")
private String jobClass;
@ApiModelProperty(value = "任务调度时间cron表达式")
private String cronExpression;
@ApiModelProperty(value = "任务描述")
private String description;
@ApiModelProperty(value = "附加参数")
private Map<String, Object> param;
}
4、编写创建和查询等测试类。
新增定时任务:
public class MonitorSystemSchedule implements Job {
private static final Logger logger = LoggerFactory.getLogger(MonitorSystemSchedule.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss");
@Autowired
private SysMonitorService sysMonitorService;
@Autowired
private SysWarningService sysWarningService;
private static final double NCSYLYZ=0.8;
private static final double CPUSYLYZ=0.8;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SysMonitor sysMonitor = new SysMonitor();
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
String osName = osmxb.getName();
//总物理内存
long totalPhysicalMemorySize = osmxb.getTotalPhysicalMemorySize()/ 1024L;
//空闲内存
long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize()/ 1024L;
//已用内存
long usedPhysicalMemorySize = totalPhysicalMemorySize - freePhysicalMemorySize;
//内存使用率
Double ncsyl = Double.valueOf(usedPhysicalMemorySize)/Double.valueOf(totalPhysicalMemorySize);
//当前cpu系统占用率
Double cpuzyl = osmxb.getSystemCpuLoad();
sysMonitor.setXtznc(Double.valueOf(totalPhysicalMemorySize));
sysMonitor.setXtsync(Double.valueOf(freePhysicalMemorySize));
//以百分比形式存入
sysMonitor.setNcsyl(ncsyl*100);
sysMonitor.setCpusyl(cpuzyl*100);
sysMonitor.setCjsj(new Date());
//将监控数据入库
sysMonitorService.save(sysMonitor);
//判断数据是否异常(目前CPU阈值写死为80%,内存占比阈值写死为80%)
if(cpuzyl.compareTo(CPUSYLYZ)>=0){
SysWarning sysWarning = new SysWarning();
sysWarning.setCjsj(new Date());
sysWarning.setClzt(SysWarningDealStatusEnum.NOT_DEAL.getCode());
sysWarning.setGjjb(SysWarningLevelEnum.YYS.getCode());
sysWarning.setGjlx(SysWarningTypeEnum.CPULYLGJ.getCode());
sysWarning.setGjnr(SysWarningTypeEnum.CPULYLGJ.getType());
sysWarning.setGjy(SysWarningSourceEnum.SYSTEM.getCode());
sysWarning.setGjz(cpuzyl*100);
sysWarning.setGjyz(CPUSYLYZ*100);
sysWarningService.save(sysWarning);
}
if(ncsyl.compareTo(NCSYLYZ)>=0){
SysWarning sysWarning = new SysWarning();
sysWarning.setCjsj(new Date());
sysWarning.setClzt(SysWarningDealStatusEnum.NOT_DEAL.getCode());
sysWarning.setGjjb(SysWarningLevelEnum.YYS.getCode());
sysWarning.setGjlx(SysWarningTypeEnum.NCGJ.getCode());
sysWarning.setGjnr(SysWarningTypeEnum.NCGJ.getType());
sysWarning.setGjy(SysWarningSourceEnum.SYSTEM.getCode());
sysWarning.setGjz(ncsyl*100);
sysWarning.setGjyz(NCSYLYZ*100);
sysWarningService.save(sysWarning);
}
}
}
public void addJob(String clazzName, String jobName, String groupName, String cronExp, String desc, Map<String, Object> param) {
try {
// 启动调度器,默认初始化的时候已经启动
// scheduler.start();
// 获取jobClass
Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(clazzName);
//获得JobDataMap,写入数据
JobDataMap jobDataMap = new JobDataMap();
if (null != param) {
jobDataMap.putAll(param);
}
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, groupName).withDescription(desc).setJobData(jobDataMap).build();
//表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExp);
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(scheduleBuilder).usingJobData(jobDataMap).build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
log.error("创建任务失败", e);
}
}
public List<JobInfoDTO> getAllJobs() {
List<JobInfoDTO> jobList = new ArrayList<>();
try {
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
JobDetail job = scheduler.getJobDetail(jobKey);
for (Trigger trigger : triggers) {
JobInfoDTO jobInfo = buildJobInfo(jobKey, trigger.getKey());
jobInfo.setJobDescription(job.getDescription());
jobInfo.setJobClassName(job.getJobClass().getName());
jobInfo.setJobDataMap(job.getJobDataMap());
setTriggerRule(jobInfo, trigger);
jobList.add(jobInfo);
}
}
} catch (SchedulerException e) {
log.error("QuartzManager getAllJobs is error !!!", e);
throw new RuntimeException(e);
}
return jobList;
}
spring管理定时任务,实现网页新增,停用,查看定时任务的功能
原文:https://www.cnblogs.com/0116ct/p/14954735.html