在springboot工程中创建定时任务,使用quartz

简介: 在springboot工程中创建定时任务,使用quartz

开篇

这篇只介绍怎么用,不说原理;

先说一种常用的定时任务的方法;

使用schedule

定时任务最常用的是使用Springboot自带schedule;

使用springboot自带的schedule实现定时任务,不用引用任何第三方的工具包,只需要:

  • 在启动类上增加@EnableScheduling注解,即可开启定时任务的支持;
  • 定义自己的定时任务业务逻辑类 加上注解@Component或@Configuration,在定时任务的具体逻辑方法加上注解@Schedule("${cron表达式}")

使用Quratz:

Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。
Quartz 允许程序开发人员根据时间的间隔来调度作业。
Quartz 实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。

创建springboot工程:

在IDEA中基于springboot 2.7.*创建工程,集成Quratz,勾选I/O下Quratz Scheduler即可;
在这里插入图片描述
创建完成后的pom.xml主要内容:

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gz</groupId>
    <artifactId>gz</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sz</name>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        </dependencies>

上面Quratz的依赖是

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
创建一个Job
Job 表示一个工作,要执行的具体内容。

创建job时只需要继承QuratzJobBean,然后实现其中的executeInternal方法即可;

//Job类,触发定时任务后执行的操作
// QuartzJobBean是一个抽象类,实现了Quartz的Job接口。
//DisallowConcurrentExecution 禁止并发执行
@Component
@DisallowConcurrentExecution
public class PushJob extends QuartzJobBean {

    ObjectMapper mapper = new ObjectMapper();

    @PostConstruct
    public void init(){
        //每次运行都会加载一次
        //System.out.println(System.currentTimeMillis()+"--pushJob-");
    }

    @Override
    protected void executeInternal(JobExecutionContext context) {
        System.out.println(System.currentTimeMillis()+"--push-");
       try {
            Thread.sleep(30000);
            System.out.println("test");
            System.out.println(mapper.writeValueAsString(context.getMergedJobDataMap()));
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
    }
}
Job配置

创建JobConfiguration,注意添加注解Configuration;
在JobConfiguration中添加两个Bean

JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
Trigger 代表一个调度参数的配置,什么时候去调。

还有一个Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
在Trigger中使用withSchedule方法加入调用队列;

@Configuration
public class JobConfiguration {

    @Value("${quartz.push.cron:0/5 * * * * ?}")
    private String restartCron; // corn表达式

       @Bean
    public JobDetail pushJobDetail(){
        JobDetail jobDetail = JobBuilder.newJob(PushJob.class)
                .withIdentity("pushJob")
                .storeDurably()
                .build();
        return jobDetail;
    };

    @Bean
    public Trigger pushJobTrigger(){

        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
                .cronSchedule(restartCron);

        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(pushJobDetail())
                .usingJobData("type","studio")
                .withIdentity("pushJobTrigger")
                .withSchedule(scheduleBuilder)
                .build();

        return trigger;
    }

}

后续只需要在Job中编码处理业务逻辑即可;

启动服务,即可看到Job中定时刷新功能;

关于注解DisallowConcurrentExecution

DisallowConcurrentExecution禁止并发执行多个相同定义的JobDetail,这个注解是加在Job类上的,但意思并不是不能同时执行多个Job, 而是不能并发执行同一个JobDefinition(由JobDetail定义)
相关文章
|
3月前
|
Java 关系型数据库 MySQL
SpringBoot 集成 Quartz + MySQL
SpringBoot 集成 Quartz + MySQL
103 1
|
3月前
|
Java 测试技术 数据库
SpringBoot单元测试快速写法问题之不想在PandoraBoot工程中Mock Dao层如何解决
SpringBoot单元测试快速写法问题之不想在PandoraBoot工程中Mock Dao层如何解决
|
4月前
|
SQL Java 调度
实时计算 Flink版产品使用问题之使用Spring Boot启动Flink处理任务时,使用Spring Boot的@Scheduled注解进行定时任务调度,出现内存占用过高,该怎么办
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
Java 数据库连接 Maven
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
|
5月前
|
Java Maven Spring
创建Springboot工程的过程详细步骤
【6月更文挑战第17天】 创建Springboot工程涉及以下步骤: 1. 安装JDK和Maven并配置环境变量。 2. 在IDEA中新建项目,选择`Create from archetype`,选取`spring-boot-starter-parent`。 3. 输入项目名、包名和模块名,完成设置。 4. 生成的项目包含Springboot主类`Application`。 5. 添加所需功能,如控制器、服务和数据访问对象,使用Spring注解。 6. 运行`Application`启动项目。要深入学习,参考官方文档或在线教程。 ```
50 3
|
5月前
|
消息中间件 设计模式 Java
SpringBoot+Schedule 定时任务的配置开关
SpringBoot+Schedule 定时任务的配置开关
149 0
SpringBoot+Schedule 定时任务的配置开关
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的贵工程寝室快修小程序附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的贵工程寝室快修小程序附带文章源码部署视频讲解等
29 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的贵工程寝室快修附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的贵工程寝室快修附带文章源码部署视频讲解等
36 1
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的贵工程学生宿舍管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的贵工程学生宿舍管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
31 0
|
6月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的冀中工程技师校园网站的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的冀中工程技师校园网站的详细设计和实现(源码+lw+部署文档+讲解等)