目录
- Quartz
- 概念
- 1.任务 Job
- 2.触发器 Trigger
- 3.调度器 Scheduler
- 实操
- 总结
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 {@Serialprivate static final long serialVersionUID = 1L;/*** 任务id*/@TableIdprivate 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表达式构建一个新的triggerCronTrigger 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);}}
总结
项目自己构建定时任务界面,所有后台设计了实体存入数据库,方便前台页面调用。