首页 > 其他分享 >SpringBoot 设置动态定时任务

SpringBoot 设置动态定时任务

时间:2022-12-14 18:32:57浏览次数:55  
标签:nextExecutionTime SpringBoot springframework cron org import 定时 动态 public


前言

SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,不是太灵活,改文章是主要是实现在固定的基础上进行的一小步的改进,如果更复杂的这种定时任务调度的实现请可以借助xxl-job 实现分布式任务调度。

解决方案

  • pom.xml 实现
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- spring boot 2.3版本后,如果需要使用校验,需手动导入validation包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

配置文件application.yml,只定义了服务端口:

server:
port: 8089

定时任务执行时间配置文件:task-config.ini:

sprintTime.cron=0/10 * * * * ?

定时任务执行类:

package com.example.scheduletask.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
* 定时任务
* @author hxy
*/
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {

@Value("${sprintTime.cron}")
private String cron;

private Long timer = 10000L;

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 动态使用cron表达式设置循环间隔
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
log.info("Current time: {}", LocalDateTime.now());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 使用CronTrigger触发器,可动态修改cron表达式来操作循环规则
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecutionTime;
// 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
// PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
// Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
// return nextExecutionTime;
}
});
}
}

编写一个测试接口,使得可以通过调用接口动态修改该定时任务的执行时间:

package com.example.scheduletask.controller;
import com.example.scheduletask.config.ScheduleTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
@RequestMapping("/task")
public class ScheduleController {


@Autowired
public ScheduleTask scheduleTask;


@GetMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
scheduleTask.setCron(cron);
return "ok";
}

@GetMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
scheduleTask.setTimer(timer);
return "ok";
}
}

除了上面的借助cron表达式的方法,还有另一种触发器,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,不像cron表达式只能定义小于等于间隔59秒,可以通过设置timer,来实现间隔时间的设置。

总结

虽然这种方式看看起来比较笨,但他有时确实可以解决问题,这里是介绍个思路,其实他可以实现一些通过数据库存储来实现任务调度的灵活性,但是如果是要实现分布式任务的话,可能就无法满足要求,但你可以试一下xxl-job。


标签:nextExecutionTime,SpringBoot,springframework,cron,org,import,定时,动态,public
From: https://blog.51cto.com/u_15461374/5938175

相关文章

  • 基于Springboot+Mybatis+mysql+vue宠物领养网站1
    @目录一、系统介绍二、功能展示1.主页(普通用户)2.登陆、注册(普通用户)3.宠物大全(普通用户)4.宠物详情(申请领养、点赞、评论)(普通用户)5.我的申请(普通用户)6.个人信息(普通用户......
  • SpringBoot入门系列:Spring Security 和 Angular JS(1)
    SpringSecurity和AngularJS系列,是一文的解析。受保护的单页面应用程序这一节我们要展示将SpringSecurity、SpringBoot和AngularJS放在一起使用的一些不错的特性,它......
  • SpringBoot入门系列:Spring Security 和 Angular JS(2)
    添加动态的内容目前我们已经有了一个应用程序,硬编码了一句问候语在里面。这对学习如何把这些凑到一起很有帮助,不过实际上我们期望的是来自于后台服务器的内容,因此我们可以创......
  • SpringBoot入门系列: JPA mysql(五)
    一,准备工作,建立spring-boot-sample-mysql工程1、http://start.spring.io/    A、Artifact中输入spring-boot-sample-mysql    B、勾选Web下的web    C、勾选......
  • SpringBoot入门:Hello World(一)
       跟随SpringBoot的文档(http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-documentation)学习,前后几章关联才调通代码,煞是痛苦,在......
  • 关于在springboot中的controller引入不了service报错解决办法
    关于在springboot中的controller引入不了service报错解决办法报错如下:不仅是controller一层出现问题,每一层都是相同的问题解决步骤:1.当出现了这个错误不要慌,首先清......
  • Java做UI自动化和app自动化中动态代理@FindBy的工作原理【杭州多测师_王sir】【杭州多
    Java做UI自动化和app自动化中动态代理@FindBy的工作原理一、背景简介由于Selenium框架采用PageObject设计模式让测试代码与被测页面对象代码分离,因而提供了不少很方便的注......
  • uni-app 动态修改主题色
    老是碰到初版制作完成没多久,就整一出说什么要更改整个项目的色彩体系。真的是宝宝心里苦啊!起初都是通过uni项目自带的uni.scss中定义,在替换页面上对应的css。以便于达......
  • spring boot创建多线程定时任务
    @Component@EnableScheduling//1.开启定时任务@EnableAsync//2.开启多线程publicclassMultithreadScheduleTask{@Async@Schedule......
  • SpringBoot(五):JSR303校验
    一、什么是JSR303校验JSR,是JavaSpecificationRequests的缩写,意思是Java规范提案,是指向JCP(JavaCommunityProcess)提出新增一个标准化技术规范的正式请求。JCP(JavaCo......