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日

相关文章

  • ajax提交session超时跳转页面使用全局的方法来处理

    下面我将详细讲解“ajax提交session超时跳转页面使用全局的方法来处理”的攻略: 1. 为什么需要处理session超时问题? 在网站应用中,为了提高用户体验和保护用户数据安全,通常需要对用户进行登录鉴权,登录成功后保留用户信息,而服务器端的Session就是一个将用户信息和服务器端的数据进行关联的机制。但是Session都有一个生命周期,当这个生命周…

    Java 2023年6月16日
    00
  • Groovy动态语言使用教程简介

    Groovy动态语言使用教程简介 什么是Groovy动态语言 Groovy是一种基于JVM的动态语言,它可以与Java语言无缝集成并且具备很多Java语言的特性。Groovy动态语言的主要特点是它支持运行时的元编程和动态方法调用,使得程序员可以更加灵活地开发项目并提高开发效率。 Groovy的安装和配置 在使用Groovy之前,需要安装和配置相应的环境。以下…

    Java 2023年5月26日
    00
  • Java中时间戳的获取和转换的示例分析

    本文将详细讲解Java中获取和转换时间戳的方法以及示例分析。 什么是时间戳 在计算机领域中,时间戳指的是从某个固定时间点(通常指1970年1月1日00:00:00 UTC)到当前时间的毫秒数或秒数。 获取时间戳 在Java中,获取当前时间的时间戳可以使用System.currentTimeMillis()方法,它返回的是当前时间以毫秒为单位的时间戳。 lon…

    Java 2023年5月20日
    00
  • Java中关于Collections集合工具类的详细介绍

    Java中的集合工具类(Collections) Java中的集合框架提供了许多用于存储和操作一组对象的数据结构。Java提供了一个集合工具类Collections,该类提供了许多静态方法来方便地操作集合。 集合工具类的特点 提供了一组静态方法,用于方便地操作集合。 所有的方法都是静态方法,无需创建Collections实例对象。 Collections类不…

    Java 2023年5月26日
    00
  • java MyBatis拦截器Inteceptor详细介绍

    Java MyBatis拦截器Inteceptor详细介绍 什么是MyBatis拦截器Inteceptor MyBatis拦截器Inteceptor是MyBatis中的一个重要组件,使用拦截器可以实现对MyBatis的许多事务进行拦截和控制,比如SQL执行、查询结果处理等等。MyBatis拦截器Inteceptor主要由两部分组成:拦截器接口和拦截对象。 如…

    Java 2023年5月20日
    00
  • Springboot整合Netty自定义协议实现示例详解

    针对“Springboot整合Netty自定义协议实现示例详解”这一话题,我来给您进行详细的讲解和介绍。 1. 环境搭建 首先,我们需要在本地环境搭建好所需的开发环境。具体来说,我们需要安装好以下组件: Java SDK(1.8或更高版本) Spring Boot(2.0或更高版本) Netty(4.1或更高版本) 安装完成后,我们就可以开始进行具体的开发工…

    Java 2023年5月20日
    00
  • springbean的八种加载方式汇总

    下面是针对”springbean的八种加载方式汇总”的完整攻略。 概述 在Spring框架中,bean的创建和处理是核心功能之一。了解bean的加载方式及其使用场景有助于我们更好的理解Spring框架的本质。 Spring bean的加载方式主要有八种: 基于XML配置文件的方式 基于注解的方式 基于Java Config的方式 基于自动装配的方式 基于Ja…

    Java 2023年5月19日
    00
  • springBoot中的properties配置解析

    在Spring Boot中,可以使用properties文件来配置应用程序的属性。这些属性可以用于配置数据源、日志、缓存、安全等方面。本文将详细讲解Spring Boot中的properties配置解析,包括如何定义属性、如何使用属性、如何覆盖属性等。 定义属性 在Spring Boot中,可以使用application.properties或applica…

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