定时任务Quartz使用

11 篇文章 0 订阅

入门案例

参考链接:https://www.w3cschool.cn/quartz_doc/quartz_doc-1xbu2clr.html

引入依赖:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>
  • Scheduler - 与调度程序交互的主要API。(关联并管理任务和触发器)
  • Job - 你想要调度器执行的任务组件需要实现的接口(逻辑代码)
  • JobDetail - 用于定义作业的实例。(可有多个实例)
  • Trigger(即触发器) - 定义执行给定作业的计划的组件。(可有多个触发器,任务什么时间执行)
    请添加图片描述

首先新建一个Job类。

Job中可通过参数context获取 调度器、job实例、触发器 传递的参数

import java.time.LocalDateTime;

public class HelloJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Object tv1 = context.getTrigger().getJobDataMap().get("t1");
        Object tv2 = context.getTrigger().getJobDataMap().get("t2");
        Object jv1 = context.getJobDetail().getJobDataMap().get("j1");
        Object jv2 = context.getJobDetail().getJobDataMap().get("j2");
        Object sv = null;
        try {
            sv = context.getScheduler().getContext().get("skey");
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        System.out.println(tv1+":"+tv2);
        System.out.println(jv1+":"+jv2);
        System.out.println(sv);
        System.out.println("hello:"+ LocalDateTime.now());
    }
}

在test类中新建调度器、job实例、触发器

可在调度器、job实例、触发器中传递参数

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TestQuartz {
    public static void main(String[] args) throws SchedulerException {

        //创建一个scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.getContext().put("sKey", "sValue");

        //创建一个job
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .usingJobData("j1", "jv1")
                .withIdentity("myJob", "myGroup").build();
        job.getJobDataMap().put("j2", "jv2");

        //创建一个Trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .usingJobData("t1", "tv1")
                // 3秒执行一次
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3)
                        .repeatForever()).build();
        trigger.getJobDataMap().put("t2", "tv2");

        //注册trigger并启动scheduler
        scheduler.scheduleJob(job, trigger);
        scheduler.start();

    }
}

Spring Boot整合Quartz-持久化到数据库

参考链接:

https://www.cnblogs.com/sxxs/p/13383929.html

https://blog.csdn.net/qq_45337977/article/details/122890488

引入依赖
请添加图片描述
添加配置文件quartz.properties(官网默认配置文件在org.quartz包下)

# 主配置
org.quartz.scheduler.instanceName=MyScheduler
org.quartz.scheduler.skipUpdateCheck=true
# ThreadPool配置
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#最多有25个任务同时在执行,如果有第26个任务将会被搁置
org.quartz.threadPool.threadCount=25
org.quartz.threadPool.threadPriority=5
# JobStoreTx配置
#第一个任务的执行完后的结束时间 减去 第二个任务的开始时间 = 时间间隔,时间间隔 大于 60s时, 第二个任务不会被执行。
#这个叫做失败临界值,或者临界时间
org.quartz.jobStore.misfireThreshold=6000

#存储方式使用JobStoreTX,也就是数据库
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#指示JDBCJobStore,JobDataMaps中的所有值都将是“字符串”,因此可以将其存储为key-value键值对,而不是以BLOB列的序列化形式存储更复杂的对象。
org.quartz.jobStore.useProperties=true

org.quartz.jobStore.dataSource=myDS
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix=qrtz_
#是否使用集群(如果项目只部署到 一台服务器,就不用了)
org.quartz.jobStore.isClustered=false

#修改连接池(Quartz默认为c3p0连接池)
org.quartz.dataSource.myDS.provider=hikaricp
org.quartz.dataSource.myDS.driver=org.postgresql.Driver
org.quartz.dataSource.myDS.URL=jdbc:postgresql://localhost:5432/dtmg?useUnicode=true&characterEncoding=utf8&autoReconnect=true&stringtype=unspecified
org.quartz.dataSource.myDS.user=postgres
org.quartz.dataSource.myDS.password=Password
#最大连接数
org.quartz.dataSource.myDS.maxConnections=50

在数据库中执行对应数据库 sql 文件

数据库语句:org.quartz.impl.jdbcjobstore包下

配置-JobFactory

由于可能要在job里注入spring对象,不做配置,是无法注入的。

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

@Component
public class JobFactory extends SpringBeanJobFactory {
    @Resource
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 进行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

创建quartz的配置文件

import org.quartz.Scheduler;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Properties;

@Configuration
public class QuartzConfig {

    @Resource
    private JobFactory jobFactory;

    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        try {
            schedulerFactoryBean.setJobFactory(jobFactory);
            // 任何作业是否应覆盖现有作业定义。
            schedulerFactoryBean.setOverwriteExistingJobs(true);
            // 设置调度器在应用程序启动后多长时间启动
            schedulerFactoryBean.setStartupDelay(10);
            schedulerFactoryBean.setQuartzProperties(quartzProperties());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return schedulerFactoryBean;
    }

    /**
     * 从配置文件中获取对应的配置
     * @return 返回配置文件
     * @throws IOException 读取文件异常
     */
    @Bean
    public Properties quartzProperties() throws IOException {
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
        propertiesFactoryBean.afterPropertiesSet();
        return propertiesFactoryBean.getObject();
    }

    @Bean
    public Scheduler scheduler() {
        return schedulerFactoryBean().getScheduler();
    }
}

封装定时任务的启动、修改、删除的一些工具

import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;

@Component
@Slf4j
public class QuartzJobManager {

    private static QuartzJobManager jobUtil;

    @Resource
    private Scheduler scheduler;

    public QuartzJobManager() {
        log.info("init jobUtil");
        jobUtil = this;
    }

    public static QuartzJobManager getInstance() {
        log.info("return  JobCreateUtil");
        return QuartzJobManager.jobUtil;
    }

    /**
     * 创建job
     *
     * @param jobClass       任务/触发器 类
     * @param jobName        任务/触发器 名称
     * @param jobGroupName   任务所在组名称
     * @param cronExpression cron表达式
     */
    public void addJob(Class jobClass, String jobName, String jobGroupName, String cronExpression) throws Exception {
        addJob(jobClass, jobName, jobGroupName, cronExpression, null);
    }


    /**
     * 创建job,可传参
     *
     * @param jobClass       任务类
     * @param jobName        任务/触发器 名称
     * @param jobGroupName   任务/触发器 所在组名称
     * @param cronExpression cron表达式
     * @param argMap         map形式参数
     */
    public void addJob(Class jobClass, String jobName, String jobGroupName, String cronExpression, Map<String, Object> argMap) throws Exception {
        try {
            // 判断是否已有该任务,有则先删除
            deleteJob(jobName, jobGroupName);
            // 构建job信息
            JobDetail jobDetail = JobBuilder.newJob(jobClass)
                    .withIdentity(jobName, jobGroupName)
                    .build();
            // 构建Trigger信息
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(jobName, jobGroupName)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                    .build();
            //获得JobDataMap,写入数据
            if (argMap != null) {
                trigger.getJobDataMap().putAll(argMap);
            }
            // 调度容器设置JobDetail和Trigger
            scheduler.scheduleJob(jobDetail, trigger);
            // 如果调度器关闭就启动
            if (scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error(jobName + ":加入定时任务失败");
            throw new Exception("加入定时任务失败");
        }
    }

    /**
     * 暂停job
     *
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 所在组名称
     */
    public void pauseJob(String jobName, String jobGroupName) {
        try {
            scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 恢复job
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 所在组名称
     */
    public void resumeJob(String jobName, String jobGroupName) {
        try {
            scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }


    /**
     * job 更新,只更新频率
     * @param jobName        任务/触发器 名称
     * @param jobGroupName   任务/触发器 所在组名称
     * @param cronExpression cron表达式
     */
    public void updateJob(String jobName, String jobGroupName, String cronExpression) {
        updateJob(jobName, jobGroupName, cronExpression, null);
    }


    /**
     * job 更新,更新频率和参数
     *
     * @param jobName        任务/触发器 名称
     * @param jobGroupName   任务/触发器 所在组名称
     * @param cronExpression cron表达式
     * @param argMap         参数
     */
    public void updateJob(String jobName, String jobGroupName, String cronExpression, Map<String, Object> argMap) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
            // 表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // 按新的cronExpression表达式重新构建trigger
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
            //修改map
            if (argMap != null) {
                trigger.getJobDataMap().putAll(argMap);
            }
            // 按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * job 更新,只更新更新参数
     *
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 所在组名称
     * @param argMap       参数
     */
    public void updateJob(String jobName, String jobGroupName, Map<String, Object> argMap) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            //修改map
            trigger.getJobDataMap().putAll(argMap);
            // 按新的trigger重新设置job执行
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * job 删除
     *
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 所在组名称
     */
    public void deleteJob(String jobName, String jobGroupName) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
            if (triggerKey != null) {
                scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
                scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
                scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 启动所有定时任务
     */
    public void startAllJobs() {
        try {
            scheduler.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 关闭所有定时任务
     */
    public void shutdownAllJobs() {
        try {
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取所有任务列表
     *
     * @return 返回任务map列表
     */
    public List<Map<String, Object>> getAllJob() {
        GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
        List<Map<String, Object>> jobList = new ArrayList<>();
        Set<JobKey> jobKeys;
        try {
            jobKeys = scheduler.getJobKeys(matcher);
            for (JobKey jobKey : jobKeys) {
                List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
                for (Trigger trigger : triggers) {
                    Map<String, Object> job = new HashMap<>(16, 0.75f);
                    job.put("jobName", jobKey.getName());
                    job.put("jobGroupName", jobKey.getGroup());
                    job.put("trigger", trigger.getKey());
                    Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
                    job.put("jobStatus", triggerState.name());
                    if (trigger instanceof CronTrigger) {
                        CronTrigger cronTrigger = (CronTrigger) trigger;
                        String cronExpression = cronTrigger.getCronExpression();
                        job.put("cronExpression", cronExpression);
                    }
                    jobList.add(job);
                }
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return jobList;
    }

    /**
     * 获取某个任务
     *
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 组
     * @return 返回任务map
     */
    public Map<String, Object> getJobInfo(String jobName, String jobGroupName) {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
        Map<String, Object> job = new HashMap<>(16, 0.75f);
        try {
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return job;
            }
            job.put("jobName", jobName);
            job.put("jobGroupName", jobGroupName);
            job.put("trigger", trigger.getKey());
            Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
            job.put("jobStatus", triggerState.name());
            String cronExpression = trigger.getCronExpression();
            job.put("cronExpression", cronExpression);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return job;
    }

    /**
     * 是否存在某个任务
     *
     * @param jobName      任务/触发器 名称
     * @param jobGroupName 任务/触发器 组
     * @return 返回boolean值
     */
    public boolean flagJob(String jobName, String jobGroupName) {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
        try {
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return false;
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return true;
    }
}

根据自己需求创建自己的Job

import com.codvision.serverboot.service.XXXXService;
import lombok.SneakyThrows;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

@Component
public class XXXXJob implements Job {

    @Resource
    private XXXXService xxxxService;

    @SneakyThrows
    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        JobDataMap jobDataMap = jobExecutionContext.getTrigger().getJobDataMap();
        int taskId = Integer.parseInt(jobDataMap.get("xxxId").toString());
        xxxxService.updateXXXX(xxxId);
    }
}

业务层根据自己需求,对任务进行操作

@Slf4j
@Service
public class XXXXService{
	@Resource
    private QuartzJobManager quartzJobManager;
    
    // 方法中调用quartzJobManager对应方法即可
}

如需求比较简单,也可不创建QuartzJobManager,直接创建对应的job实例、触发器工具类。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是关于使用Spring BootQuartz实现定时任务的简介: Quartz是一个流行的Java定时任务框架,可以在应用程序中执行各种定时任务,如定期备份、数据抽取和数据分析等。而Spring Boot是一个快速开发框架,提供了方便的集成Quartz的方式。 要使用Spring BootQuartz实现定时任务,首先需要在pom.xml文件中添加QuartzSpring Boot Quartz的依赖项。然后,定义一个定时任务,可以使用注解@Scheduled来指定任务的执行时间。例如: ```java @Component public class MyScheduler { @Scheduled(cron = "0 0/10 * * * ?") public void myTask() { //执行定时任务的代码 } } ``` 上述代码表示每隔10分钟执行一次myTask()方法。然后,在Spring Boot的主类中,使用@EnableScheduling注解来开启定时任务的支持。例如: ```java @SpringBootApplication @EnableScheduling public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } } ``` 最后,启动应用程序,定时任务将按照预定时间自动执行。如果需要更高级的定时任务控制,还可以使用Quartz的其他功能,如JobDetail和Trigger等。 ### 回答2: SpringBoot是一个开源的Java开发框架,它提供了很多有用的工具和插件,其中之一便是定时任务quartzquartz是一款功能强大的开源调度框架,它提供了简单易用的任务调度机制,支持多线程和分布式部署,可以满足大部分的调度需求。 在SpringBoot中,我们可以很方便地使用quartz来实现定时任务。以下是使用SpringBootquartz实现定时任务的基本步骤: 1. 在pom.xml文件中添加quartz的依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 创建一个任务类,实现Job接口,并实现execute方法来定义任务逻辑: ``` @Component public class MyTask implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 定时任务的执行逻辑 } } ``` 3. 在配置文件中定义任务调度器,并为任务分配cron表达式: ``` spring: quartz: job-store-type: jdbc properties: org.quartz.scheduler.instanceName: MyScheduler org.quartz.threadPool.threadCount: 5 job-details: myJob: durability: true requestsRecovery: true trigger-details: myTrigger: cron: 0 0/1 * * * ? job-name: myJob job-data-map: name: world ``` 4. 在任务执行类中,使用@Scheduled注解来指定任务的执行时间: ``` @Component public class MyTask { @Scheduled(cron = "0 0/1 * * * ?") public void doTask(){ // 定时任务的执行逻辑 } } ``` 以上4种方法都是使用SpringBootquartz实现定时任务的简单示例,根据实际需求可以进行相应调整和扩展。总的来说,使用springbootquartz实现定时任务非常方便,能够让我们更加轻松地管理、调度和执行任务,提高开发效率和质量。 ### 回答3: Spring Boot是一款快速构建基于Spring应用的工具,可帮助简化开发和部署。在Spring Boot中,与Quartz相比,Scheduled定时任务通常是首选的。但是,Quartz比Scheduled更灵活、功能更强大、配置更灵活,因此在一些特殊情况下,使用Quartz进行定时任务调度是比较必要的。 Quartz是用Java语言编写的一个开源的调度框架,其主要用于在一个预定义的时间间隔内重复执行某个任务,或者在特定时间点执行某个任务。Quartz提供了众多功能,比如支持分布式定时任务管理、支持动态创建/删除任务、支持时间表达式、状态存储、监控和事件触发等等。 Spring Boot集成了Quartz非常容易,只需要在Spring Boot项目中添加Quartz相关依赖,在Spring Boot配置文件中增加Quartz配置即可。以下是一个完整的Spring Boot集成Quartz的示例代码: 1.在pom.xml中添加QuartzSpring Boot Starter Web依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> ``` 2.在配置文件中增加Quartz相关配置: ``` spring.quartz.job-store-type=memory spring.quartz.properties.org.quartz.threadPool.threadCount=10 spring.quartz.properties.org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore ``` 3.编写定时任务处理类: ``` @Component public class JobScheduler { @Autowired private Scheduler scheduler; @Scheduled(cron = "0 0/1 * * * ?") public void doSomething() { JobDetail jobDetail = buildJobDetail(); Trigger trigger = buildJobTrigger(jobDetail); try { scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { e.printStackTrace(); } } private JobDetail buildJobDetail() { JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("key", "value"); return JobBuilder.newJob(Job.class) .withIdentity(UUID.randomUUID().toString(), "job-group") .withDescription("sample job") .usingJobData(jobDataMap) .storeDurably(true) .build(); } private Trigger buildJobTrigger(JobDetail jobDetail) { return TriggerBuilder.newTrigger() .forJob(jobDetail) .withIdentity(UUID.randomUUID().toString(), "trigger-group") .withDescription("sample trigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) .build(); } } ``` 虽然Quartz需要对定时任务进行配置,但是它提供了更为灵活的条件和任务调度,非常适合在实际生产环境中使用。总之,使用Spring Boot集成Quartz可以非常方便地实现定时任务的调度,既简单又强大,可以大大提高应用的效率和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值