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日

相关文章

  • 如何在Jsp中使用JDBC来联结MySql

    下面是如何在JSP中使用JDBC连接MySQL的攻略: 1. 添加MySQL JDBC驱动 1.1 下载MySQL JDBC驱动:在MySQL官网下载mysql-connector-java jar包。下载地址:https://dev.mysql.com/downloads/connector/j/。 1.2 将mysql-connector-java ja…

    Java 2023年6月15日
    00
  • IntelliJ IDEA引入第三方jar包或查看Java源码的时候报decompiled.class file bytecode version:52.0(java 8)错误的解决办法

    当我们在使用 IntelliJ IDEA 引入第三方jar包或查看Java源码的时候,有时会出现以下错误提示信息: Error: java: decompiled.class file bytecode version:52.0 (java 8) 这是因为项目使用的Java版本与第三方jar包或源码使用的Java版本不一致导致的。要解决此问题,我们需要采取以…

    Java 2023年5月20日
    00
  • 详解hibernate自动创建表的配置

    下面是详解Hibernate自动创建表的配置的完整攻略。 概述 Hibernate是一种流行的面向对象关系映射(ORM)框架,可用于将Java对象与关系型数据库(如MySQL)之间进行映射。Hibernate不仅提供了用于执行CRUD(创建、读取、更新和删除)操作的API,还可以自动创建与Java实体类对应的数据库表。在本攻略中,我们将重点探讨Hiberna…

    Java 2023年5月20日
    00
  • JSP中out对象的实例详解

    下面是本人为大家准备的详细讲解“JSP中out对象的实例详解”的攻略。 JSP中out对象的实例详解 1. out对象简介 在JSP页面中,out对象是一个内置对象,用于向客户端输出内容。 2. out对象的创建 当在JSP页面中使用语句 out.print(“hello, world”) 时,就会自动创建一个名为 “out” 的输出流对象。 3. out对…

    Java 2023年6月15日
    00
  • SrpingDruid数据源加密数据库密码的示例代码

    首先我们需要明确什么是SpringDruid数据源,以及为什么需要加密数据库密码。 SpringDruid数据源是一种基于Spring框架和阿里巴巴德鲁伊连接池的数据源,它能够提高数据库的连接性能、可用性和稳定性。 在实际应用中,我们通常需要在配置文件中配置数据库连接信息,包括数据库用户名和密码。然而,这样做存在一定风险,因为配置文件可能会被非授权的人员获取…

    Java 2023年5月20日
    00
  • 5分钟快速上手Spring Boot

    5分钟快速上手Spring Boot 简介 Spring Boot是一个快速开发框架,可以让开发者快速地创建基于Spring的应用程序。通过集成常用的组件和框架,Spring Boot减少了许多繁琐的配置和集成操作,使得开发者可以专注于业务逻辑的实现。 步骤 步骤一:创建一个Spring Boot项目 在Spring Initializr网站中,配置你的项目…

    Java 2023年6月15日
    00
  • 常见的Java并发编程框架有哪些?

    常见的Java并发编程框架有以下几种: Java并发包(java.util.concurrent) Java并发包是Java SE 5之后提供的一组并发编程工具类,它们提供了对线程、锁、原子变量、线程池、阻塞队列等底层机制的封装,方便程序员开发并发程序,避免了手动处理锁、线程等并发编程中的常见问题,例如死锁、内存泄漏等。 使用Java并发包可以通过以下步骤实…

    Java 2023年5月11日
    00
  • Spring Boot环境属性占位符解析及类型转换详解

    Spring Boot环境属性占位符解析及类型转换详解 在Spring Boot应用程序中,我们可以使用环境属性占位符来引用应用程序的配置属性。环境属性占位符是以${}的形式出现的,其中包含了一个属性名,例如${server.port}。在本文中,我们将详细介绍Spring Boot环境属性占位符的解析和类型转换。 1. 环境属性占位符解析 Spring B…

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