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日

相关文章

  • redis数据库安装及简单的增删改查

    redis下载地址:https://github.com/MSOpenTech/redis/releases。 解压之后,运行 redis-server.exe redis.windows.conf 。如下图: 不要关闭redis-server.exe窗口,打开redis-cli.exe -h,如下图:  接下来就可以实现简单的命令了! 查看所有key ke…

    Redis 2023年4月11日
    00
  • CentOS 7下使用rpm包安装mysql 5.7.18

    下面是CentOS 7下使用rpm包安装mysql 5.7.18的完整攻略,包含以下步骤: 步骤1:下载mysql的rpm包 首先,我们需要到mysql官网下载对应版本的rpm包。在本例中,我们需要下载mysql 5.7.18的rpm包,可以在以下网址中下载: https://dev.mysql.com/downloads/mysql/5.7.html 我们…

    database 2023年5月22日
    00
  • oracle数据库添加或删除一列的sql语句

    当需要向已有的Oracle数据库表中添加一列或删除一列的时候,我们可以使用以下的SQL语句。 添加一列 语法 ALTER TABLE table_name ADD (column_name column_type); 参数说明 table_name:要添加列的表名称 column_name:要添加的列名称 column_type:要添加的列的数据类型 示例 …

    database 2023年5月21日
    00
  • php代码出现错误分析详解

    PHP代码出现错误分析详解 在PHP开发中,出现错误是非常常见的事情。当代码出现错误时,我们需要对错误进行分析,找出错误的原因并进行修复。本文将详细讲解如何对PHP代码出现错误进行分析,以及如何进行逐步排错的过程。 1. 阅读错误信息 当PHP代码出现错误时,PHP会返回一段错误信息。这个错误信息可以帮助我们判断错误的原因。我们需要认真阅读错误信息,了解错误…

    database 2023年5月21日
    00
  • Java中抓取 Thread Dumps 的方式汇总

    让我来详细讲解一下“Java中抓取 Thread Dumps 的方式汇总”的完整攻略。 什么是 Thread Dumps Thread Dumps是Java应用程序中线程的快照。它提供了应用程序中所有线程的状态信息,包括线程运行的代码行、线程锁定的对象以及线程的堆栈跟踪。抓取Thread Dumps信息可以帮助我们定位线程死锁、死循环等问题。 抓取 Thre…

    database 2023年5月21日
    00
  • Oracle中的table()函数使用

    Oracle中的table()函数是一种特殊的表达式,用于将传入函数的数据集(数组、集合等)转换为表格形式。在SQL查询中,它可以被用来处理和查询此类对象。下面是使用table()函数的完整攻略: 1. 创建一个包含table()函数的查询 首先,创建一个SQL查询,其中包含table()函数,用来处理输入数据集并将其转换为可查询的表格。 SELECT * …

    database 2023年5月21日
    00
  • 业务开发和销售的区别

    业务开发和销售的区别 业务开发和销售是企业中两个重要的职能部门,虽然它们都与商品或服务的交易有关系,但它们的角色和职责有着内在的差别。 业务开发 业务开发通常是指企业寻找并与新客户建立联系、发掘新的业务机会,为企业带来持续的利润增长。业务开发的工作聚焦于业务拓展和市场开拓,并直接与顾客进行沟通来确定他们的需求和痛点。 业务开发的主要任务有: 研究市场和行业,…

    database 2023年3月27日
    00
  • redhat 4中安装Oracle 10g图文教程

    Red Hat 4下安装Oracle 10g图文教程 本文介绍在Red Hat 4下安装Oracle 10g的详细步骤,适用于初学者和想要重新安装Oracle 10g的人。 准备工作 在安装Oracle 10g之前,请确保您已经完成以下准备工作: 确定您的操作系统是Red Hat 4 确保您的系统内存和硬盘空间符合Oracle 10g的最低要求 下载Orac…

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