程序员的资源宝库

网站首页 > gitee 正文

Quartz 定时任务整合SpringBootDome

sanyeah 2024-04-13 16:16:06 gitee 3 ℃ 0 评论

Quartz 定时任务整合SpringBootDome

Quartz 的四核心对象

  1. Job

    Job 汉语工作的意思,也不难看出这是一个放具体要执行的业务代码;

  2. JobDetail

    JobDetail 这个是任务详情,把那个具体的任务关联起来(关联具体的Job)

  3. Trigger

    Trigger 这个是触发器,是要触发要执行的任务

  4. Scheduler

    Scheduler 调度器 是要把所有的任务详情和触发器都注册尽量,进行管理,(Scheduler 是单例模式)

进入maven 坐标

quartz需要spring-context的支持,所以引入 spring-context-support

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.9</version>
</dependency>

代码实现

  1. 配置调度器 Schedule(此处借鉴renren-fast 的定时任务配置)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * @Description Description
 * @Author 张凯强
 * @Date Created in 2021/8/25
 * @E-mail 248048521@qq.com
 */

@Configuration
public class ScheduleConfig {

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(dataSource);
        //quartz参数
        Properties prop = new Properties();
        prop.put("org.quartz.scheduler.instanceName", "RenrenScheduler");
        prop.put("org.quartz.scheduler.instanceId", "AUTO");
        //线程池配置
        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
        prop.put("org.quartz.threadPool.threadCount", "20");
        prop.put("org.quartz.threadPool.threadPriority", "5");
        //JobStore配置
        prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
        //集群配置
        prop.put("org.quartz.jobStore.isClustered", "true");
        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");

        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
        prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");

        //PostgreSQL数据库,需要打开此注释
        //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");

        factory.setQuartzProperties(prop);

        factory.setSchedulerName("RenrenScheduler");
        //延时启动
        factory.setStartupDelay(30);
        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
        //可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
        factory.setOverwriteExistingJobs(true);
        //设置自动启动,默认为true
        factory.setAutoStartup(true);

//        factory.setTaskExecutor();
        return factory;
    }
}
  1. 创建一个任务
import lombok.SneakyThrows;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
 * @Description 创建一个任务
 * @Author 张凯强
 * @Date Created in 2021/8/25
 * @E-mail 248048521@qq.com
 */

//@PersistJobDataAfterExecution // 单例实例化
//@DisallowConcurrentExecution  // 禁止并发执行
public class QuartzJob extends QuartzJobBean {
    
    @SneakyThrows
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		// context.getScheduler() 调度器
        Scheduler scheduler = context.getScheduler();
        // context.getTrigger() 触发器
        Trigger trigger = context.getTrigger();
        System.out.println(new Date());
        // 可以在创建任务详情时传值进来,这里可以获取
        System.out.println(trigger.getJobDataMap().get("zkq"));
        // context.getJobDetail() 任务
        JobDetail jobDetail = context.getJobDetail();
        System.out.println(jobDetail.getJobDataMap().get("zkq"));
    }
  1. 服务层和服务实现层
/**
 * @Description Description
 * @Author 张凯强
 * @Date Created in 2021/8/25
 * @E-mail 248048521@qq.com
 */
public interface ScheduleJobService {
}

/**
 * @Description Description
 * @Author 张凯强
 * @Date Created in 2021/8/25
 * @E-mail 248048521@qq.com
 */

@Service
public class ScheduleJobServiceImpl implements ScheduleJobService {

    //注入调度器
    @Autowired
    Scheduler scheduler;
    
    /**
     * 项目启动时,初始化定时器
     */
    
    @PostConstruct  // 在对象初始化时执行
    public void init(){
        System.out.println("开始...");
        // 创建一个 触发器key
        TriggerKey triggerKey = new TriggerKey("trigger", "group");
        try {
            // 获取这个触发器 
            Trigger trigger = scheduler.getTrigger(triggerKey);
            if (trigger == null){
                // 触发器为空时构建一个触发器 0/10 * * * * ? 每10秒触发一次 规则请自行百度cron表达式
                trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey)
                        .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?").withMisfireHandlingInstructionDoNothing()).build();
                rigger.getJobDataMap().put("zkq","aaa");
                // 构建一个任务详情, 把任务放进来,这个对象类型为class,这里是 QuartzJob.class
                JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity("job", "group").build();
                // 把之任务和触发器注册进调度器中
                jobDetail.getJobDataMap().put("zkq","每天努力一点点!");
                scheduler.scheduleJob(jobDetail, trigger);
//                scheduler.triggerJob();
                // 运行这个调度器
               // scheduler.start();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

}

成功结果

在这里插入图片描述

到此结束!有错误欢迎提出,大神勿喷!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表