Quartz
quartz 是一款开源且丰富特性的任务调度库,能够集成与任何的java 应用,下到独立应用,大到电子商业系统。quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务。
概念
1.任务 Job
我们想要调度的任务都必须实现 org.quartz.job 接口,然后实现接口中定义的 execute( ) 方法
2.触发器 Trigger
Trigger 作为执行任务的调度器。我们如果想要凌晨1点执行备份数据的任务,那么 Trigger 就会设置凌晨1点执行该任务。其中 Trigger 又分为 SimpleTrigger 和 CronTrigger 两种。
3.调度器 Scheduler
Scheduler 为任务的调度器,它会将任务 Job 及触发器 Trigger 整合起来,负责基于 Trigger 设定的时间来执行 Job。
实操
导入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
创建实体
@TableName(value = "schedule_job", keepGlobalPrefix = true)
public class ScheduleJob implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 任务id
*/
@TableId
private Long jobId;
/**
* spring bean名称
*/
@NotBlank(message = "bean名称不能为空")
private String beanName;
/**
* 方法名
*/
@NotBlank(message = "方法名称不能为空")
private String methodName;
/**
* 参数
*/
private String params;
/**
* cron表达式
*/
@NotBlank(message = "cron表达式不能为空")
private String cronExpression;
/**
* 任务状态 0:正常 1:暂停
*/
private Integer status;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createTime;
}
创建任务
public void createScheduleJob(ScheduleJob scheduleJob) {
try {
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity(getJobKey(scheduleJob)).build();
//表达式调度构建器,可以根据scheduleJob修改withMisfireHandling方法,但是使用异步执行定时任务,没必要
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
.withMisfireHandlingInstructionFireAndProceed();
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob)).withSchedule(scheduleBuilder).build();
//放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob);
scheduler.scheduleJob(jobDetail, trigger);
//暂停任务
if (scheduleJob.getStatus().equals(ScheduleStatus.PAUSE.getStatus())) {
pauseJob(scheduleJob);
}
} catch (Exception e) {
throw new ActInternalSystemException("创建定时任务失败", e);
}
}
执行任务
public void run(ScheduleJob scheduleJob) {
try {
//参数
JobDataMap dataMap = new JobDataMap();
dataMap.put(QuartzJob.JOB_PARAM_KEY, scheduleJob);
scheduler.triggerJob(getJobKey(scheduleJob), dataMap);
} catch (SchedulerException e) {
throw new RuntimeException("立即执行定时任务失败", e);
}
}
总结
项目自己构建定时任务界面,所有后台设计了实体存入数据库,方便前台页面调用。