前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在springboot工程中创建定时任务,使用quartz

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

原创
作者头像
JQ实验室
发布2022-11-26 15:35:31
3K0
发布2022-11-26 15:35:31
举报
文章被收录于专栏:实用技术实用技术
开篇

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

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

使用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主要内容:

代码语言:html
复制
<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的依赖是

代码语言:txt
复制
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
创建一个Job

Job 表示一个工作,要执行的具体内容。

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

代码语言:txt
复制
//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方法加入调用队列;

代码语言:txt
复制
@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定义)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开篇
  • 使用schedule
  • 使用Quratz:
    • 创建springboot工程:
      • 创建一个Job
        • Job配置
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档