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

yizhihongxing

下面是“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日

相关文章

  • MySQL学习之数据库备份详解

    MySQL学习之数据库备份详解 什么是数据库备份? 数据库备份就是将数据库中的数据和结构进行复制并保存在另一个地方,以便在需要的时候恢复数据。 为什么要进行数据库备份? 因为数据库中的数据是极其重要和珍贵的,一旦出现了数据丢失或者数据库崩溃等问题,就会对业务运营产生非常大的影响,甚至毁掉整个业务。 因此进行数据库备份是每一个数据库管理员必须要掌握的技巧之一。…

    database 2023年5月21日
    00
  • Redis源码之SDS简单动态字符串

    Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要。 看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化。       一、SDS的结构  c语言没有string类型,本质是char[]数组;而且c语言数组创建时必须初始化大小,指定类型后就不能改变,并且字符数组的最后一个元素总是空字符 ‘\0’ 。 以下展示了一个值为 “…

    Redis 2023年4月13日
    00
  • Linux下通过script 命令记录(数据库)操作步骤

    Linux下通过script命令可以记录用户在终端窗口中的操作步骤,并保存到指定的文件中,这个过程也叫做终端录像。在数据库操作中,使用script命令可以记录用户的SQL命令、数据库操作命令以及错误提示等信息,在后期排查问题的时候非常有用。下面是详细的攻略: 1. 安装script命令 在Linux系统中,一般已经自带了script命令,如果没有安装,可以使…

    database 2023年5月22日
    00
  • 史上超强最常用SQL语句大全

    史上超强最常用SQL语句大全 简介 SQL是用于访问和管理数据库的标准语言。本文将介绍一些最常用的SQL语句,供读者参考学习。 常用语句 1. SELECT SELECT 语句用于从数据库中选取数据。语法如下: SELECT column1, column2, … FROM table_name; 示例: SELECT name, age, city F…

    database 2023年5月19日
    00
  • Linux系统中Mysql的安装备份与密码恢复

    Linux系统中MySQL的安装、备份与密码恢复攻略 1. 安装MySQL 首先需要在Linux系统上安装MySQL数据库。在Ubuntu操作系统下,可以通过以下命令进行安装: sudo apt-get update sudo apt-get install mysql-server 在安装过程中,会弹出一个对话框让你设置root用户的密码。设置一个强密码,…

    database 2023年5月22日
    00
  • SSH整合redis和MongoDB错误笔记

    由于毕设中做的是图片搜索网站,选择前端框用SSH,因为之间接触过SSH框架,略有了解,但没有深究,现在在整合redis和mongodb的过程中遇到很多错误,也是十分痛苦,只能通过百度和一步步尝试着解决问题。 首先,先把自己在整合过程中用到包先放出来。 一开始使用的是spring3.0.4,整合好redis后发现这个版本整合mongodb特别麻烦,而且网上的方…

    Redis 2023年4月12日
    00
  • Oracle 11g如何清理数据库的历史日志详解

    Oracle 11g如何清理数据库的历史日志详解 Oracle 11g数据库中包含大量的历史日志文件,这些文件会占用磁盘空间并降低系统的性能。因此,定期清理历史日志是数据库管理中的一个重要任务。在本文中,我们将详细介绍如何清理Oracle 11g数据库的历史日志。 步骤一:停止数据库 在清理历史日志之前,必须先停止数据库。在命令行窗口中输入以下命令停止Ora…

    database 2023年5月22日
    00
  • 图文详解Mysql索引的最左前缀原则

    下面就是对于Mysql索引最左前缀原则的详细讲解及示例说明: 什么是Mysql索引最左前缀原则? Mysql索引的最左前缀原则是指:在使用Mysql多列索引时,查询语句只能使用该索引的最左前缀列或左侧列。 换句话说,如果创建了一个多列索引(比如包含A、B、C3列),在查询时只有一个条件(如WHERE A=1),那么该查询可以使用该索引;如果查询时使用两个条件…

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