Spring boot整合quartz方法

目录

1.定时任务

1.quartz说明

2.Quartz提供了不同的数据存储策略以管理作业调度信息:

1.Quartz引入依赖

2.开发定时任务

(1)更新定时任务

(2)停止定时任务

(3)唤醒定时任务

(4)删除定时任务


1.定时任务

定时任务的实现途径多种多样,以下是一些不同的方法:

1. 在应用程序的启动类中引入`@EnableScheduling`注解,以此激活定时任务的功能。随后,可以利用注解`@Scheduled`,配合Cron表达式(例如`@Scheduled(cron = "0/1 * * * * ")`)来定义任务的执行频率,同时确保这些任务被注册为Spring管理的Bean。

2. 采用外部任务调度框架,例如xxl-job或elastic-Job,这些框架提供了额外的功能和灵活性,以满足更复杂的调度需求。

3. 使用Quartz作为底层实现,许多第三方框架实际上都是基于Quartz构建的,它们提供了更高级的调度功能和更好的集成支持。

1.quartz说明

Quartz是一个纯Java编写的工作调度框架,它包含以下核心组件:

1. 调度器(Scheduler): ? ?这是Quartz中负责调度作业的核心组件。它通过与触发器(Trigger)和作业详情(JobDetail)的交互来控制作业的执行。调度器作为一个容器,保存了作业和触发器,它们在调度器中都有唯一的组和名称,这些标识符用于调度器内部查找和识别特定的作业或触发器。触发器和作业详情的组名和名称必须是唯一的,尽管它们可以相同,因为它们属于不同的类别。

2. 触发器(Trigger): ? ?在Quartz中,触发器定义了作业执行的时间规则。它有两个主要的子类型:SimpleTrigger和CronTrigger,分别用于简单的周期性调度和复杂的时间表调度。

3. 作业详情(JobDetail): ? ?这包含了Quartz中作业的具体信息,包括作业的唯一标识和要执行的任务。作业详情还允许通过JobDataMap传递额外的数据给作业。

4. 作业(Job): ? ?这是Quartz中定义作业具体执行逻辑的接口。实现这个接口的类包含了作业执行的核心代码。

5. 作业构建器(JobBuilder): ? ?这是一个工具类,用于构建作业实例,并定义作业的属性,如名称和组名。构建的实例将代表一个实际要执行的作业。

6. 触发器构建器(TriggerBuilder): ? ?这个工具类用于创建触发器实例,定义触发器的属性和行为。

7. 监听器(Listener): ? ?Quartz提供了多种监听器,包括作业监听器(JobListener)、触发器监听器(TriggerListener)和调度器监听器(SchedulerListener),它们用于监控作业、触发器和调度器的事件和状态变化。

2.Quartz提供了不同的数据存储策略以管理作业调度信息:

内存存储(RAMJobStore): Quartz默认使用内存作为存储介质,这种方式因其直接在内存中操作而具有极高的性能。然而,这种存储方式不具备数据持久性,一旦应用程序崩溃或需要重新部署,所有存储的调度信息将无法保留。

数据库存储: 通过将调度信息存储在数据库中,Quartz可以实现单实例或集群部署,便于对大量作业进行集中管理和动态控制,如暂停、停止或修改作业。即使在服务器关闭或重启后,作业的调度信息也能得以保留。不过,这种存储方式的性能会受到数据库连接速度的影响。

1.Quartz引入依赖

首先,要在Springboot项目可以直接引入下面依赖

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

如果是非Springboot项目,可以引入以下依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
</dependency>

2.开发定时任务

首先,我们需要创建一个类

package com.example.yin.taskjob;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("定时任务执行:"+System.currentTimeMillis());
    }
}

接着,我们需要为他设置接口。

public interface QuartzService {
    public R addCronJob(String jobName, String cron, String jobClassName, String triggerName);
    public R updateCronJob(String jobName,String cron, String jobClassName);
    public R pauseCronJob(String jobName, String triggerName);
    public R resumeCronJob(String jobName, String triggerName);
    public R deleteCronJob(String jobName, String jobGroup, String triggerName, String triggerGroup);
}

接口中的方法用于添加、更新、暂停、恢复和删除基于Cron表达式的定时作业;返回类型为R的对象,R可能是一个自定义的响应类,用于封装方法执行的结果,请根据自己项目来修改!

然后,定时任务继承TaskJob,并实现其方法

@Service
public class QuartServiceImpl implements QuartzService {
    @Autowired
    private Scheduler scheduler;
    private static final String DEFAULT_JOB_GROUP = "default_job_group";

    private static final String DEFAULT_TRIGGER_GROUP = "default_trigger_group";

    private static final String TRIGGER_PRE = "Trigger_";
    @Override
    public R addCronJob(String jobName, String cron, String jobClassName, String triggerName) {
        try{
            JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);
            if (scheduler.checkExists(jobKey)){
                return R.fail("【添加定时任务】该作业已存在");
            }
            //构建job
            JobDetail job = (JobDetail) JobBuilder
                    .newJob((Class<? extends Job>) Class.forName(jobClassName))
                    .withIdentity(jobKey)
                    .build();
            //Cron表达式定时构造器
            CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron);
            //构建Trigger
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP))
                    .withSchedule(cronSchedule)
                    .build();
            //启动调度
            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        }catch (Exception e){
            return R.fail("创建定任务失败,原因是:" + e.getMessage());
        }
        return  R.success("创建定时任务成功!", jobName + ",任务表达式:" + cron);
    }

这个方法提供了一个完整的流程,用于将一个新的Cron作业添加到Quartz调度器中,并确保作业按照指定的Cron表达式执行。通过动态加载作业类和构建触发器,这个方法提供了灵活的作业调度能力。

然后,让我们创建一个控制类

@RestController
@RequestMapping("/quartz")
public class QuartzController {
    @Autowired
    private QuartzService quartzService;

    @PostMapping("createJob")
    public R createJob(@RequestBody JobInfo jobInfo) {
        return quartzService.addCronJob(jobInfo.getJobName(),jobInfo.getCron(),jobInfo.getJobClassName(), jobInfo.getTriggerName());
    }

到这里,其实一个简单的Quartz定时任务已经完成了

我们可以去swagger-ui测试效果(不会使用swagger-ui的小伙伴,可以使用其他接口软件)

测试接口推荐

这里推荐几个接口地址,供小伙伴自行选择

1.Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能,接口开发、测试、联调效率,提升 10 倍。最好用的接口文档管理工具,接口自动化测试工具。[这里是图片001]https://apifox.com/2.Postman: The World’s Leading API Platform | Sign Up for Free。支持各种 HTTP 请求方法,并且提供了强大的测试脚本功能,你可以为每个请求编写测试用例,自动化你的 API 测试过程。(建议科学上网使用)

3.The Collaborative API Development Platform - Insomnia。是一个轻量级的 REST 客户端,界面干净利落,使用起来非常直观,虽然 Insomnia 主要聚焦在 API 测试上,但它也提供了基本的文档生成功能。

spring boot项目控制台会显示此效果

最后,我们可以在实现方法中添加更新定时任务,停止定时任务,唤醒定时任务,删除定时任务

(1)更新定时任务
@Override
    public R updateCronJob(String jobName, String cron, String triggerName) {
        try{
            TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);
            CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule(cron);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronSchedule).build();
            scheduler.rescheduleJob(triggerKey, trigger);
            return R.success("更新定时任务成功!");
        }catch (Exception e){
            return R.fail("更新定时任务失败,原因为:" + e.getMessage());
        }
    }
(2)停止定时任务
@Override
    public R pauseCronJob(String jobName, String triggerName) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);
            JobKey jobKey = JobKey.jobKey(jobName, DEFAULT_JOB_GROUP);

            // 检查作业和触发器是否存在
            if (!scheduler.checkExists(jobKey) || !scheduler.checkExists(triggerKey)) {
                return R.fail("作业或触发器不存在");
            }

            // 暂停触发器
            scheduler.pauseTrigger(triggerKey);
            return R.success("暂停定时任务成功!");
        } catch (Exception e) {
            return R.fail("暂停定时任务失败,原因是:" + e.getMessage());
        }

    }
(3)唤醒定时任务
 @Override
    public R resumeCronJob(String jobName, String triggerName) {
        try {
            // 构建触发器key
            TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);
            // 恢复触发器
            scheduler.resumeTrigger(triggerKey);
            return R.success("恢复定时任务成功!");
        } catch (Exception e) {
            return R.fail("恢复定时任务失败,原因是:" + e.getMessage());
        }
    }
(4)删除定时任务
@Override
    public R deleteCronJob(String jobName, String jobGroup, String triggerName, String triggerGroup) {
        try {
            JobKey jobKey = JobKey.jobKey(jobName,  DEFAULT_JOB_GROUP);
            TriggerKey triggerKey = TriggerKey.triggerKey(TRIGGER_PRE + triggerName, DEFAULT_TRIGGER_GROUP);

            if (!scheduler.checkExists(jobKey) ||!scheduler.checkExists(triggerKey)) {
                return R.fail("【删除定时任务】作业或触发器不存在");
            }

            scheduler.unscheduleJob(triggerKey);
            scheduler.deleteJob(jobKey);

            return R.success("删除定时任务成功!", jobName);
        } catch (Exception e) {
            return R.fail("删除定时任务失败,原因为:" + e.getMessage());
        }
        }

在添加完所有方法后,将相应的控制类补全,swagger-ui就会呈现所有接口

以下是剩余控制类方法

@PostMapping("updateJob")
    public R updateJob(@RequestBody JobInfo jobInfo) {
        return quartzService.updateCronJob(jobInfo.getJobName(), jobInfo.getCron(), jobInfo.getTriggerName());
    }
    @PostMapping("pauseJob")
    public R pauseJob(@RequestBody JobInfo jobInfo) {
        return quartzService.pauseCronJob(jobInfo.getJobName(), jobInfo.getTriggerName());
    }

    @PostMapping("resumeJob")
    public R resumeJob(@RequestBody JobInfo jobInfo) {
        return quartzService.resumeCronJob(jobInfo.getJobName(), jobInfo.getTriggerName());
    }

    @DeleteMapping("deleteJob")
    public R deleteJob(@RequestBody JobInfo jobInfo) {
        return quartzService.deleteCronJob(jobInfo.getJobName(), jobInfo.getJobGroup(), jobInfo.getTriggerName(), jobInfo.getTriggerGroup());
    }
}

我们可以到swagger-ui去查看接口是否齐全

可以看到,我们的实现接口是正确显示的,到这里,Spring boot整合Quartz项目就算完成了。

### 回答1: Spring Boot可以很方便地整合Quartz,实现定时任务的调度。下面是整合步骤: 1. 引入依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 配置Quartz 在application.properties文件中添加以下配置: ``` # Quartz配置 spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.quartz.properties.org.quartz.scheduler.instanceName=MyScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.dataSource=myDataSource spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ spring.quartz.properties.org.quartz.dataSource.myDataSource.driverClassName=com.mysql.jdbc.Driver spring.quartz.properties.org.quartz.dataSource.myDataSource.URL=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.quartz.properties.org.quartz.dataSource.myDataSource.username=root spring.quartz.properties.org.quartz.dataSource.myDataSource.password=root spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount=10 ``` 3. 创建Job 创建一个继承自QuartzJobBean的Job类,实现executeInternal方法,该方法中编写需要执行的任务逻辑。 ``` public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { // 任务逻辑 } } ``` 4. 创建Trigger 创建一个Trigger对象,指定任务的执行时间和执行频率。 ``` Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "myGroup") .withSchedule(CronScheduleBuilder.cronSchedule(" /5 * * * ?")) // 每5分钟执行一次 .build(); ``` 5. 创建Scheduler 创建一个Scheduler对象,将Job和Trigger添加到Scheduler中。 ``` Scheduler scheduler = new StdSchedulerFactory().getScheduler(); JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "myGroup") .build(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); ``` 以上就是Spring Boot整合Quartz的基本步骤。 ### 回答2: SpringBoot是一个快速开发的微服务框架,可以帮助开发者快速搭建可用的微服务应用程序。Quartz是一个可靠的Java计划任务框架,它提供了一些便捷的功能,例如设置定时任务、指定执行策略、并发执行任务等。 SpringBoot可以与Quartz进行整合,以帮助开发者更快速、更方便地开发调度任务。整合QuartzSpringBoot需要进行如下几个步骤: 1.添加依赖 在pom.xml文件中添加quartz依赖: ``` <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> ``` 2.创建Quartz配置类 创建一个Quartz配置类,实现SchedulerFactoryBean接口。在此类中,配置Quartz的属性,例如线程池大小、数据源等。配置示例: ``` @Configuration public class QuartzConfig { @Autowired private DataSource dataSource; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); //设置数据源 schedulerFactoryBean.setDataSource(dataSource); //设置自定义Job Factory,以支持Spring DI schedulerFactoryBean.setJobFactory(jobFactory()); //设置线程池大小 schedulerFactoryBean.setThreadPoolSize(10); //设置Quartz属性,例如执行策略等 Properties properties = new Properties(); properties.setProperty("org.quartz.scheduler.instanceName", "MyQuartzScheduler"); properties.setProperty("org.quartz.threadPool.threadCount", "10"); properties.setProperty("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); schedulerFactoryBean.setQuartzProperties(properties); return schedulerFactoryBean; } @Bean public JobFactory jobFactory() { return new AutowiringSpringBeanJobFactory(); } } ``` 3.创建任务 创建需要执行的任务类,并实现Job接口。任务类中执行的具体任务逻辑可以在execute()方法中实现。 ``` @Component public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job executed!"); } } ``` 4.添加任务到调度器 在需要执行任务的服务中,获取Quartz调度器,并将任务添加到调度器中。调度器可以通过SchedulerFactoryBean对象获取。任务执行的时间可以通过CronTriggerFactoryBean设置。 ``` @Service public class MyService { @Autowired private SchedulerFactoryBean schedulerFactoryBean; public void scheduleJob() throws SchedulerException { JobDetail jobDetail = newJob(MyJob.class) .withIdentity("myJob", "myGroup") .build(); CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean(); triggerFactoryBean.setJobDetail(jobDetail); triggerFactoryBean.setName("myTrigger"); triggerFactoryBean.setGroup("myTriggerGroup"); triggerFactoryBean.setCronExpression("0 0/5 * * * ?"); //每5分钟执行一次 Trigger trigger = triggerFactoryBean.getObject(); Scheduler scheduler = schedulerFactoryBean.getScheduler(); scheduler.scheduleJob(jobDetail, trigger); } } ``` 至此,我们已经成功整合QuartzSpringBoot,并可以通过调度任务运行应用程序。这样就可以更快速、更方便、更可靠地开发调度任务了。 ### 回答3: Spring Boot是一个轻量级的开发框架,它非常适合开发基于Java的web应用程序。Quartz是一个开源的、基于Java的定时任务调度框架,它可以实现复杂的任务调度需求。在Spring Boot中,使用Quartz框架可以方便地实现定时任务的调度。 首先,需要在pom.xml文件中添加QuartzSpring Boot的依赖库: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>${spring-boot-version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency> ``` 然后,在主应用程序中添加@EnableScheduling注解来启用定时任务调度功能。此外,还需要在spring配置文件中配置Quartz相关的参数,例如数据源、触发器、任务等。以下是一个简单的Quartz配置文件示范: ``` quartz: job-store-type: jdbc jdbc: initialize-schema: always datasource: url: jdbc:h2:mem:quartz driver-class-name: org.h2.Driver username: password: properties: org.quartz.scheduler.instanceName: QuartzScheduler org.quartz.threadPool.threadCount: 10 ``` 在配置文件中,可以设置Quartz中任务调度的基本属性,例如线程池大小等等。同时,需要编写一个任务类,该类需要实现Spring提供的接口org.springframework.scheduling.quartz.QuartzJobBean。这样,在执行任务时,Spring就可以调用对应的executeInternal方法。 最后,在主应用程序中编写一个SchedulerFactoryBean,它将负责调度任务。在这个类中可以设置触发器的属性等等,最后通过getScheduler方法启动定时任务调度。 总体而言,基于Spring Boot整合Quartz框架开发定时任务非常方便,而且可以快速高效地完成各种任务调度需求。用户可以在Spring Boot的基础上自由定制任务调度的相关参数,实现复杂的业务功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值