quartz定时任务框架简单demo

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能:

持久性作业 - 就是保持调度定时的状态;
作业管理 - 对调度作业进行有效的管理;

这个小demo是结合数据库实现任务调度,使用的是springboot,也用了mybatis-plus。

  1. 依赖包
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
  1. 表结构和实体类
    在这里插入图片描述
 @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;
}
  1. 调度设置
@Configuration
public class QuartzConfigration {
   
    @Bean(name = "multitaskScheduler")
    public SchedulerFactoryBean schedulerFactoryBean(){
   
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        return schedulerFactoryBean;
    }
  1. 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"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值