SpringBoot实现动态控制定时任务支持多参数功能

下面是“SpringBoot实现动态控制定时任务支持多参数功能”的完整攻略。

简介

SpringBoot是基于Spring框架的一种快速开发框架,可以轻松完成Web开发、任务调度等日常任务。我们常常需要使用定时任务来完成一些周期性的任务,而定时任务也需要支持多参数传递,以便动态控制任务的执行时间和任务参数。本文将介绍如何使用SpringBoot框架来实现动态控制定时任务支持多参数功能。

实现步骤

第一步: pom.xml中添加依赖

首先我们需要在项目的pom.xml文件中添加quartz和spring-context-support等必要的依赖。

<!-- Quartz依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    <version>2.4.2</version>
</dependency>

<!-- Spring的上下文支持 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.3</version>
</dependency>

第二步:创建定时任务类

我们需要创建一个继承JobDetail的自定义的定时任务类,该类实现了executeInternal方法,在方法中实现定时任务的逻辑。

public class MyTask extends JobDetail {

    private Logger log = LoggerFactory.getLogger(MyTask.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        log.info("任务开始执行");
        String param1 = context.getJobDetail().getJobDataMap().getString("param1");
        String param2 = context.getJobDetail().getJobDataMap().getString("param2");
        log.info("参数1:" + param1);
        log.info("参数2:" + param2);
        //实现具体逻辑
    }
}

第三步:创建任务调度类

我们需要创建一个继承QuartzJobBean的自定义的任务调度类,该类在executeInternal方法中执行定时任务。

public class MyTaskScheduler extends QuartzJobBean {

    private Logger log = LoggerFactory.getLogger(MyTaskScheduler.class);

    private MyTask myTask;

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        myTask.execute(context);
    }

    public void setMyTask(MyTask myTask) {
        this.myTask = myTask;
    }
}

第四步:配置定时任务

在application.yml文件中配置定时任务的时间和任务参数等信息。

quartz:
  properties:
    org:
      quartz:
        threadPool:
          threadCount : 10 #线程池大小
  job:
    mytask:
      cron : 0/10 * * * * ? #定时任务执行时间表达式
      param1 : "hello" #任务参数1
      param2 : "world" #任务参数2

第五步:启动定时任务

我们需要在SpringBoot项目启动时启动定时任务。

@SpringBootApplication
public class MyApplication implements CommandLineRunner {

    @Autowired
    private MyTaskScheduler myTaskScheduler;

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

    @Override
    public void run(String... args) throws Exception {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setSchedulerName("myScheduler");
        schedulerFactoryBean.setAutoStartup(true);
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        schedulerFactoryBean.setJobDetails(myTaskScheduler.getJobDetail());
        schedulerFactoryBean.setTriggers(myTaskScheduler.getCronTrigger());
        schedulerFactoryBean.start();
    }
}

第六步:动态调整定时任务参数

我们可以通过代码的方式来动态调整定时任务的参数,以便动态控制任务的执行。

@Autowired
private Scheduler scheduler;

public void changeJob(String param1, String param2) throws Exception {
    JobKey jobKey = new JobKey("mytask");
    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
    JobDataMap jobDataMap = jobDetail.getJobDataMap();
    jobDataMap.put("param1", param1);
    jobDataMap.put("param2", param2);
    CronTrigger cronTrigger = scheduler.getTrigger(new TriggerKey("mytaskTrigger", "myScheduler"));
    CronScheduleBuilder cronSchedule = CronScheduleBuilder.cronSchedule("0/20 * * * * ?"); //动态调整定时任务执行时间
    cronTrigger = cronTrigger.getTriggerBuilder().withIdentity(cronTrigger.getKey()).withSchedule(cronSchedule).build();
    scheduler.rescheduleJob(cronTrigger.getKey(), cronTrigger);
}

示例说明

下面为大家演示两个示例,以便更好地理解动态控制定时任务支持多参数功能的步骤。

示例一:实现定时任务每隔一段时间打印一次“Hello World”

public class MyTask extends JobDetail {

    private Logger log = LoggerFactory.getLogger(MyTask.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        log.info("Hello World");
    }
}

示例二:实现定时任务获取一段时间内的日志,并将日志写入到文件中

public class MyTask extends JobDetail {

    private Logger log = LoggerFactory.getLogger(MyTask.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        String startTime = context.getJobDetail().getJobDataMap().getString("startTime");
        String endTime = context.getJobDetail().getJobDataMap().getString("endTime");
        List<String> logList = getLogs(startTime, endTime); //获取一段时间内的日志
        writeLogsToFile(logList); //将日志写入到文件中
    }

    private List<String> getLogs(String startTime, String endTime) {
        //实现具体逻辑,获取一段时间内的日志
    }

    private void writeLogsToFile(List<String> logList) {
        //实现具体逻辑,将日志写入到文件中
    }
}

以上就是“SpringBoot实现动态控制定时任务支持多参数功能”的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot实现动态控制定时任务支持多参数功能 - Python技术站

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

相关文章

  • SQL 查询 SELECT

    SQL(Structured Query Language)是一种可以用来查询和处理关系型数据库的计算机语言。SELECT 是 SQL 中最常用的命令之一,它用来获取表中的数据。 下面是 SELECT 命令的语法: SELECT column1, column2, … FROM table_name; 其中,column1,column2 表示需要返回的…

    database 2023年3月27日
    00
  • mysql中TIMESTAMPDIFF案例详解

    MySQL中TIMESTAMPDIFF函数的用法 在MySQL中,TIMESTAMPDIFF函数可以用来计算两个日期或时间之间的差值,以指定的时间单位作为结果。下面是TIMESTAMPDIFF函数的用法及示例。 语法 TIMESTAMPDIFF(unit, datetime_expression1, datetime_expression2) 其中,unit…

    database 2023年5月22日
    00
  • MySQL常用的日期时间函数汇总(附实例)

    MySQL 常用的日期时间函数是在处理日期时间时经常用到的函数。以下是常见的日期时间函数汇总,以及附带实例说明。 1. DATE_FORMAT DATE_FORMAT 函数用于将日期格式化为特定的格式。其语法如下: DATE_FORMAT(date,format) 其中, date 是一个日期值,format 是我们想要的日期显示格式。例如: SELECT …

    database 2023年5月22日
    00
  • SQL 生成简单的预测

    下面是SQL生成简单的预测的完整攻略: 什么是SQL生成简单的预测? SQL生成简单的预测是指使用SQL语句来进行数据分析并预测结果的方法。这种方法适用于数据量较小、结构简单的数据集,通常用于做一些简单的数据预测和分析。 SQL生成简单的预测的具体步骤 SQL生成简单预测的步骤主要包括以下几个方面: 1. 寻找数据源 首先需要找到数据源。数据源可以是数据库里…

    database 2023年3月27日
    00
  • 怎么永久激活Navicat for MongoDB 附激活教程+注册机下载

    怎么永久激活Navicat for MongoDB 一、下载Navicat for MongoDB注册机 首先,我们需要下载Navicat for MongoDB的注册机,可以在百度上搜索“Navicat for MongoDB注册机下载”或在下载网站上进行搜索,如草窝网和天翼云盘等。 下载完注册机后,解压缩并运行软件。 二、下载Navicat for Mo…

    database 2023年5月22日
    00
  • 05【掌握】 SpringBoot 清空Redis所有缓存

    package top.yangbuyi.system.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.sp…

    Redis 2023年4月11日
    00
  • sql server的 update from 语句的深究

    下面是一份 SQL Server update from 语句的深入攻略。 什么是 Update from 语句? Update from 语句是一种 SQL Server 的数据更新语句,它可以根据查询结果集来更新某个或多个数据表中的数据。通常情况下,Update from 语句可以更加高效、有效地更新大批量数据。 Update from 语句的一般格式:…

    database 2023年5月21日
    00
  • 为什么分布式一定要有Redis?

      本文围绕以下几点进行阐述: 为什么使用 Redis 使用 Redis 有什么缺点 单线程的 Redis 为什么这么快 Redis 的数据类型,以及每种数据类型的使用场景 Redis 的过期策略以及内存淘汰机制 Redis 和数据库双写一致性问题 如何应对缓存穿透和缓存雪崩问题 如何解决 Redis 的并发竞争 Key 问题   为什么使用 Redis  …

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部