Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:
持久性作业 - 就是保持调度定时的状态;
作业管理 - 对调度作业进行有效的管理;
这个小demo是结合数据库实现任务调度,使用的是springboot,也用了mybatis-plus。
- 依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- 表结构和实体类
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Quartz implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 任务group名称
*/
private String groupName;
/**
* 任务job名称
*/
private String jobName;
/**
* cron表达式
*/
private String cron;
/**
* 0 - 代表正在执行 1 - 已删除 2 - 暂停
*/
private Integer status;
private Date createTime;
private Date updateTime;
private String description;
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class TaskScheduleModel extends Model<TaskScheduleModel> {
/**
* 所选作业类型:
* 0 -> 每秒
* 1 -> 每天
* 2 -> 每月
* 3 -> 每周
* 4 ->每分
*/
Integer jobType;
/**一周的哪几天*/
Integer[] dayOfWeeks;
/**一个月的哪几天*/
Integer[] dayOfMonths;
/**秒 */
Integer second;
/**分 */
Integer minute;
/**时 */
Integer hour;
}
- 调度设置
@Configuration
public class QuartzConfigration {
@Bean(name = "multitaskScheduler")
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
return schedulerFactoryBean;
}
- mapper
只做了任务状态更新
boolean updateStatus(@Param("jobName") String jobName, @Param("groupName") String groupName,@Param("status")int status);
<update id="updateStatus">
update quartz set status=#{status}
where job_name=#{jobName} and group_name=#{groupName}
</update>
5.服务接口和实现
public interface QuartzService extends IService<Quartz> {
/**
* 开启调度程序
* @return
*/
void start();
/**
* 关闭调度程序
*/
void shutdown();
/**
* 添加一个任务,并将其加入调度程序
* @param quartz
*/
void saveJob(Quartz quartz) throws ClassNotFoundException, SchedulerException;
/**
* 想调度程序添加一个任务
* @param quartz
*/
void addJob(Quartz quartz) throws ClassNotFoundException, SchedulerException;
/**
* 暂停任务
* @param jobName
* @param groupName
*/
void pauseJob(String jobName,String groupName);
/**
* 暂停全部任务
*/
void pauseAll();
/**
* 重启任务
* @param jobName
* @param groupName
*/
void resumeJob(String jobName,String groupName);
/**
* 重启全部任务
*/
void resumeAll();
/**
* 删除任务
* @param jobName
* @param groupName
*/
void deleteJob(String jobName,String groupName);
/**
* 修改任务,主要是修改定时器执行时间,组名可以修改,但任务名不可修改
* @param jobName
* @param groupName
* @param cronExpression
*/
void updateJob(String jobName,String groupName,String cronExpression) throws Exception;
}
@Service
public class QuartzServiceImpl extends ServiceImpl<QuartzMapper, Quartz> implements QuartzService {
@Resource(name = "multitaskScheduler")
private Scheduler scheduler;
@Autowired
private QuartzMapper quartzMapper;
@Override
public void start() {
try {
scheduler.start();
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.anyJobGroup());
ArrayList<JobKey> jobKeys1 = new ArrayList<>(jobKeys);
for (JobKey jobKey:jobKeys1) {
quartzMapper.updateStatus(jobKey.getName(),jobKey.getGroup(),0);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void shutdown() {
try {
scheduler.shutdown();
Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.anyJobGroup());
ArrayList<JobKey> jobKeys1 = new ArrayList<>(jobKeys);
for (JobKey jobKey:jobKeys1) {
quartzMapper.updateStatus(jobKey.getName(),jobKey.getGroup(),2);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void saveJob(Quartz quartz) throws ClassNotFoundException, SchedulerException {
//配置定时任务对应的Job,这里执行的是ScheduledJob类中定时的方法
JobDetail jobDetail = JobBuilder
.newJob((Class<? extends Job>) Class.forName("com.siyu.quartztest.task."+quartz.getJobName()))
.usingJobData("jobName"