Spring Boot如何实现定时任务的动态增删启停详解

下面我会详细讲解“Spring Boot如何实现定时任务的动态增删启停详解”的完整攻略。

什么是定时任务?

定时任务(Scheduled Task)是指在指定的时间点或时间间隔内自动执行某个操作的任务。在很多场景下,我们经常需要定时执行某些操作,例如定时清理临时数据、定时发送邮件等。

Spring Boot如何实现定时任务

Spring Boot 提供了标准的方式来支持定时任务的实现,主要借助了 @EnableScheduling 注解和 @Scheduled 注解。

添加依赖

pom.xml 中添加 Spring Boot 定时任务的依赖:

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

启用定时任务

在启动类上添加 @EnableScheduling 注解,启用 Spring Boot 定时任务功能:

@SpringBootApplication
@EnableScheduling
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

定义定时任务

定义定时任务使用 @Scheduled 注解,该注解可以标记在方法上,并可以设置定时任务的触发条件,例如:

@Component
public class MyTask {
    @Scheduled(fixedRate = 1000)
    public void doTask() {
        System.out.println("定时任务执行中...");
    }
}

上面的例子中,使用 @Scheduled(fixedRate = 1000) 设置了每隔 1000 毫秒执行一次 doTask 方法,该方法中的代码会在定时任务触发时被执行。

动态增删启停定时任务

通过上述的方式,我们可以实现简单的定时任务功能,但是如何实现动态增删启停定时任务呢?

方式一:使用 TaskScheduler 接口实现动态任务

Spring Boot 为我们提供了 TaskScheduler 接口,可以实现动态添加和删除任务的功能。我们只需要注入该接口的实例,然后借助 ScheduledFuture 对象控制任务的执行即可。

示例代码如下:

@Component
public class DynamicTask {
    @Autowired
    private TaskScheduler taskScheduler;

    private ScheduledFuture<?> future;

    /**
     * 开启任务
     * @param interval 任务间隔,毫秒数
     */
    public void start(long interval) {
        stop();
        this.future = taskScheduler.scheduleAtFixedRate(() -> {
            System.out.println("动态定时任务执行中...");
        }, interval);
    }

    /**
     * 停止任务
     */
    public void stop() {
        if (this.future != null) {
            this.future.cancel(true);
        }
    }
}

在上述代码中,我们定义了 DynamicTask 类,其中 start 方法用于启动任务,接收一个时间间隔参数 interval,该方法会先停止已存在的任务,再根据传入参数启动新任务,任务的执行内容是打印一条日志信息。stop 方法用于停止任务,基于 ScheduledFuture 对象实现。

方式二:使用 Quartz 框架实现动态任务

当具备更高的动态性能力时,我们可以选择使用 Quartz 框架。

在 Spring Boot 中,通过添加 spring-boot-starter-quartz 依赖,并在配置文件中设置各种参数即可使用 Quartz 实现定时任务。

下面是一个使用 Quartz 实现动态增删启停定时任务的示例代码:

@Component
public class DynamicQuartzTask extends QuartzJobBean {
    private static final Logger LOGGER = LoggerFactory.getLogger(DynamicQuartzTask.class);

    private Scheduler scheduler;

    private String schedulerName;

    private String jobName;

    private String groupName;

    private String cronExpression;

    public DynamicQuartzTask(Scheduler scheduler, String schedulerName, String jobName, String groupName, String cronExpression) {
        this.scheduler = scheduler;
        this.schedulerName = schedulerName;
        this.jobName = jobName;
        this.groupName = groupName;
        this.cronExpression = cronExpression;
    }

    /**
     * 启动任务
     * @throws Exception
     */
    public void start() throws Exception {
        // 如果 job 存在,则删除任务
        JobKey key = new JobKey(jobName, groupName);
        if (scheduler.checkExists(key)) {
            scheduler.deleteJob(key);
        }

        // 构造 jobDetail
        JobDetail jobDetail = JobBuilder.newJob(getClass()).withIdentity(jobName, groupName).build();

        // 构造 trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName)
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();

        // 启动定时任务
        scheduler.scheduleJob(jobDetail, trigger);
    }

    /**
     * 停止任务
     * @throws Exception
     */
    public void stop() throws Exception {
        scheduler.deleteJob(new JobKey(jobName, groupName));
    }

    @Override
    public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        LOGGER.info("动态定时任务执行中...");
    }
}

上述代码中,我们定义了 DynamicQuartzTask 类,构造方法中接收 Scheduler 对象和各种任务相关的参数,使用 checkExists 方法检查任务是否已存在,如果存在则删除任务,接着构造 JobDetailTrigger,最后通过 scheduleJob 方法来启动任务。

具体使用可以参考下面的例子:

@Component
public class ScheduleTaskTest implements CommandLineRunner {

    @Autowired
    private Scheduler scheduler;

    @Autowired
    private DynamicQuartzTask dynamicQuartzTask;

    @Override
    public void run(String... args) throws Exception {
        // 动态添加定时任务
        dynamicQuartzTask.start();

        // 20 秒后停止定时任务
        TimeUnit.SECONDS.sleep(20);
        dynamicQuartzTask.stop();

        // 5 秒后重新启动定时任务
        TimeUnit.SECONDS.sleep(5);
        dynamicQuartzTask.start();

        // 20 秒后停止定时任务
        TimeUnit.SECONDS.sleep(20);
        dynamicQuartzTask.stop();

        // 关闭 scheduler
        scheduler.shutdown();
    }
}

在上述代码中,我们定义了 ScheduleTaskTest 类,实现了 CommandLineRunner 接口,重写了 run 方法,该方法会先启动 DynamicQuartzTask 定时任务,20 秒后停止,再等待 5 秒后重新启动,最后再停止任务。

总结

在本篇攻略中,我们详细讲述了如何使用 Spring Boot 实现定时任务的动态增删启停,使用了 TaskScheduler 接口和 Quartz 框架两种方式,其中 Quartz 方式在实现动态性能方面更佳。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot如何实现定时任务的动态增删启停详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 使用SpringBoot+AOP实现可插拔式日志的示例代码

    下面是使用SpringBoot+AOP实现可插拔式日志的完整攻略。 什么是SpringBoot+AOP Spring AOP(Aspect Oriented Programming)是Spring框架中的一个重要模块,用于将额外的行为(横切逻辑)注入到系统中的特定点。SpringBoot是Spring框架的一个特殊版本,通过预先配置好常用的Bean并提供自动…

    Java 2023年5月20日
    00
  • 带你一文深入认识Java String类

    带你一文深入认识Java String类 1. 什么是Java String类 Java String类是Java编程语言中最常用的类之一。它用于处理字符串,是一个不可变的类,即一旦一个字符串被创建,它就不能被修改。String类提供了许多方法来操作字符串。 2. 如何创建Java字符串 可以通过两种方式创建Java字符串: 2.1 直接赋值创建字符串 St…

    Java 2023年5月26日
    00
  • 详解java基于MyBatis使用示例

    下面是详解“详解java基于MyBatis使用示例”的完整攻略,过程中我会给出两条示例。 介绍 MyBatis是一个Java持久化框架,可以帮助我们简化操作数据库的过程。本文将介绍如何在Java项目中使用MyBatis。 步骤 第一步:添加MyBatis依赖 在项目的pom.xml文件中添加以下代码: <dependency> <group…

    Java 2023年5月20日
    00
  • Centos7.5配置java环境安装tomcat的讲解

    下面是完整的CentOS 7.5配置Java环境并安装Tomcat的攻略: 配置Java环境 1. 下载Java安装包 首先需要到官网下载Java安装包。一般推荐下载Java 8或者Java 11版本。 示例命令: wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux…

    Java 2023年5月19日
    00
  • MySQL数据库8——数据库中函数的应用详解

    MySQL数据库8——数据库中函数的应用详解攻略 一、什么是函数 在MySQL数据库中,函数类似于程序中的函数,可以接受参数,执行一些操作,并返回结果。MySQL数据库已经内置了很多常用的函数,包括字符串、数值、日期和时间等方面的函数。 二、常见的函数 1. 字符串函数 字符串函数主要用于处理字符串类型的数据,下面列举了一些常见的字符串函数及其说明: CON…

    Java 2023年6月16日
    00
  • Springboot项目平滑关闭及自动化关闭脚本

    下面是详细讲解“Spring Boot 项目平滑关闭及自动化关闭脚本”的完整攻略: 什么是 Spring Boot 项目平滑关闭? Spring Boot 项目平滑关闭是指在关闭 Spring Boot 项目时会先等待当前请求处理完成再关闭应用程序。这样可以保证处理请求的过程不被中断。 如何实现 Spring Boot 项目平滑关闭? 使用 actuator…

    Java 2023年5月20日
    00
  • Springboot项目中内嵌sqlite数据库的配置流程

    首先,我们需要在pom.xml中引入sqlite-jdbc依赖。在dependencies标签中添加如下代码: <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version&gt…

    Java 2023年5月20日
    00
  • jvm中指定时区信息user.timezone问题及解决方式

    关于JVM中指定时区信息的问题与解决方式,我们可以分以下几步来进行讲解: 1. 了解时区 时区是指地球上划分为24个时区的区域。它是以经线划分的,每个时区都跨度15°,从东向西依次为UTC+12、UTC+11、UTC+10、……、UTC-11、UTC-12。 2. JVM中的时区 在JVM运行中,时区信息是通过System类中的user.timezone属性…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部