springboot 集成自定义Quartz

1.创建一个springboot 项目 (因为后面的Quartz需要数据库做持久化所以自己集成mysql)

2.引入Quartz需要的pom文件

<dependency>
     <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

3.添加Quartz配置内容 

#定时任务调度器scheduler名字
spring.quartz.scheduler-name=weiQuartz
#持久化方式
spring.quartz.job-store-type=jdbc
#同样名字的job在插入到表中会报错,设置为true会覆盖之前相同名字的job
spring.quartz.overwrite-existing-jobs=true
#项目启动时是否自动创建数据库表never表示不创建表,always表示每次都会创建表
spring.quartz.jdbc.initialize-schema=never
#由于自带的sql脚本的注释为-,启动会报错,因此将自带的sql脚本注释改为#
spring.quartz.jdbc.comment-prefix=#
#关闭项目时,等待正在执行的定时任务执行完毕
spring.quartz.wait-for-jobs-to-complete-on-shutdown=true
#线程池
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#生成线程守护进程
spring.quartz.properties.org.quartz.threadPool.makeThreadsDaemons=true
#线程数量
spring.quartz.properties.org.quartz.threadPool.threadCount=10
#线程优先级
spring.quartz.properties.org.quartz.threadPool.threadPriority=5

4.创建一个jobUtils的工具类

import com.skyable.pma.entity.job.JobInfo;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class JobUtils {
    @Autowired
    private Scheduler scheduler;
    public void addCronJob(JobInfo jobInfo) {
        // 启动调度器
        try {
            scheduler.start();
        } catch (SchedulerException e) {
            System.out.println("启动调度器失败" + e);
        }
        //构建job信息
        JobDetail jobDetail = null;
        try {
            jobDetail = JobBuilder.newJob(jobInfo.getJobClassName())
                    .withIdentity(jobInfo.getJobClassName().getSimpleName(), jobInfo.getJobGroupName()).build();
        } catch (Exception e) {
            System.out.println("创建job类失败" + e);
        }
        //表达式调度构建器(即任务执行的时间)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
                .cronSchedule(jobInfo.getCronExpression());
        //按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobInfo.getJobClassName().getSimpleName(), jobInfo.getJobGroupName())
                .withSchedule(scheduleBuilder).build();

        try {
            scheduler.scheduleJob(jobDetail, trigger);

        } catch (SchedulerException e) {
            System.out.println("创建定时任务失败" + e);
        }
    }
}

5. 创建jobInfo

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobInfo {
   
    private Class   jobClassName;   // 回调时的类
    private String  jobGroupName;   // 这个为了区分组名的,可以存放一些唯一标识等,方便后面查询数据库
    private String  cronExpression;  // cron 表达式

}

6. 书写对应的回调类

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.impl.JobDetailImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;

import java.util.Optional;
@Component
@RequiredArgsConstructor(onConstructor = @_(@Autowired))
public class JobAlarm extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDetailImpl jobDetail = (JobDetailImpl) jobExecutionContext.getJobDetail();
        String group = jobDetail.getGroup();
       // 回调后的自己业务处理
        .
        .
        .
    }
}

7. 调用

    public static void main(String[] args) {
        JobInfo jobInfo = new JobInfo();
        jobInfo.setJobClassName(JobAlarm.class);
        jobInfo.setCronExpression(DateUtil.getCron(new Date()));
        jobInfo.setJobGroupName("1");
        // 这一步一定要是注入的 我只是简单演示
        JobUtils jobUtils = new JobUtils();
        jobUtils.addCronJob(jobInfo);
    }

    /***
     *  功能描述:日期转换cron表达式
     * @param date
     * @param dateFormat : e.g:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String formatDateByPattern(Date date,String dateFormat){
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        String formatTimeStr = null;
        if (date != null) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }
    /***
     * convert Date to cron ,eg.  "0 07 10 15 1 ? 2016"
     * @param date  : 时间点
     * @return
     */
    public static String getCron(Date date){
        String dateFormat="ss mm HH dd MM ? yyyy";
        return formatDateByPattern(date, dateFormat);
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值