Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解

定时任务

在Java EE企业级开发中,定时任务(也称为后台调度或周期性任务)是非常常见的一种功能,主要用于执行那些不需要用户交互,但需要按照预定时间间隔或事件触发的任务。Java EE提供了几个框架和API来处理这种需求:

  1. Java.util.Timer和TimerTask:这是最早的定时任务解决方案,它允许你在主线程之外执行任务。然而,这通常用于一次性任务,不是特别适合复杂的业务逻辑,因为线程安全性较差。

  2. ScheduledExecutorService:这个API在Java并发包中,提供了更高级别的定时任务支持。你可以创建一个ScheduledFuture对象,它可以延迟执行,定期执行或者在特定的延迟和期限后执行。这是一个线程安全且灵活的选择。

  3. Quartz Scheduler:这是一个强大的开源任务调度框架,为Java应用程序提供了一种可靠的定时任务执行机制。它支持复杂的调度规则,包括基于日期、时间间隔、cron表达式等,并且提供了易于使用的API和详细的日志记录。

  4. JSR 223 (Scripting for Java EE):允许你使用脚本语言(如JavaScript、Groovy或Python)编写定时任务,结合了Java的灵活性和这些语言的简洁性。

  5. Spring框架:Spring提供了内置的TaskExecutor和@Scheduled注解,让你可以在Spring容器中轻松地管理和调度任务,同时还提供了与其他库(如Quartz)集成的能力。

这里说的并不是要去干什么事情

而是定时去做一件工作

其实定时任务在我们的企业级开发 中非常常见

我们做一个定时任务就行哈

在指定时间前把报表计算出来

比如我们之前的缓存计算

每隔1分钟打印一下信息

还有我们的618 双11购物

只要设定在指定时间上架商品就行

示例操作

定时器方法

方法重载

可以设置是任务 还有运行时间

这里用的就是多线程

到达指定时间后执行语句

package com.bigdata1421.demo;

import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskApp {
    public static void main(String[] args) {
        //创建一个定时器对象
        Timer timer=new Timer();
        //用定时器对象调用方法
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行");
            }
        };
        timer.schedule(task,0,2000);
    }
}

开始不停打印

但人们不满足于此

研发了各种框架

quartz

普及四个概念

导入对应的依赖

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

接下来

创建具体执行的工作

创建quartz包下的实现类

就代表创建一个具体任务

这里不是springboot容器

只是一个java对象

package com.bigdata1421.demo.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;

public class MyQuartz extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("quartz task run...");
    }
}

接下来创建配置类

书写绑定

一步一步往下绑定

package com.bigdata1421.demo.config;

import com.bigdata1421.demo.quartz.MyQuartz;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {

    @Bean
    public JobDetail printJobDetail(){
        //绑定具体的工作
        return JobBuilder.newJob(MyQuartz.class).storeDurably().build();
    }

    @Bean
    public Trigger printJobTrigger(){
        //绑定对应的工作明细
        //设置任务时间 秒 分 时 日 月 星期
        ScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule("0/5 * * * * ? ");
        return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(scheduleBuilder).build();
    }

}

可以学习一下这个写写法

叫什么cron表达式

运行boot工程

我们发现 控制台开始打印

我们启动spring容器

发现控制台能一直打印

停止工程 会shutdown

小结

task

我们做完springboot整合Quartz后

我们发现台繁琐了

我们先写了具体要写的类

然后还得写一堆配置类

把他们绑到一块

我们有简化的办法

在启动类里用注解开启定时任务的功能

package com.bigdata1421.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

写一个类

这个类定义了定时任务

package com.bigdata1421.demo.quartz;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    @Scheduled(cron ="0/1 * * * * ?")
    public void print(){
        System.out.println("spring task run");
    }

}

这样就能一直执行

小结

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

相关推荐
所待.3838 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood11 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-16 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
许苑向上19 分钟前
Dubbo集成SpringBoot实现远程服务调用
spring boot·后端·dubbo
喵叔哟36 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生42 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
郑祎亦1 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法