首页 > 其他分享 >SpringBoot外部化配置定时任务cron表达式

SpringBoot外部化配置定时任务cron表达式

时间:2023-04-03 23:57:24浏览次数:46  
标签:task SpringBoot private public cron 定时 class 表达式

SpringBoot外部化配置定时任务cron表达式

背景

在日常开发中我们经常会使用到定时任务的情况,SpringBoot为我们很方便的集成了定时任务。我们只需要简单的几部就可以配置好一个定时任务。

@Component
public class LocationTask {

    @Scheduled(cron = "0/10 * * * * ?")
    public void runTask() {
        System.out.println("hello");
    }
}

@SpringBootApplication
@EnableScheduling
public class DynamicScheduledDemoApplication {

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

}

我们只需要定义一个Task将它交给Spring管理,然后再在需要执行的任务上添加上具体的cron表达式即可。但是这种硬编码的方式其实不太合适,不方便我们后面修改。所以我们可以更改一下,将corn表达式改成外部化配置。

配置文件

最简单的一种就是直接将cron表达式的值配置在配置文件中来注入

@Component
public class LocationTask {

    @Scheduled(cron = "${my.task.cron}")
    public void runTask() {
        System.out.println("hello");
    }
}

然后再在配置文件中配置一下:

my:
  task:
    cron: 0/10 * * * * ?

MySQL配置

我们同样可以将cron配置在数据库中

我们在数据库中创建一张这样的表来存放配置文件

CREATE TABLE `scheduled_task` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `cron_expression` varchar(255) NOT NULL,
  `enabled` bit(1) NOT NULL,
  `task_name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  • ScheduledTask 为我们的Entity对象
  • ScheduledTask1、ScheduledTask2为我们具体执行定时任务的类
  • TaskSchedulerConfig用来配置定时任务执行的线程池
  • ScheduledTaskManager中通过查询所有的task配置,然后通过taskName从spring容器中找到具体的对象,将他们注入线程池中执行。
@Entity
@Table(name = "scheduled_task")
@Data
public class ScheduledTask {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "cron_expression", nullable = false)
    private String cronExpression;

    @Column(name = "task_name", nullable = false)
    private String taskName;

    @Column(name = "enabled", nullable = false)
    private Boolean enabled;

}

public interface ScheduledTaskRepository extends JpaRepository<ScheduledTask, Long> {
    List<ScheduledTask> findAllByEnabledTrue();

}

@Component
public class ScheduledTask1 implements Runnable {
    @Override
    public void run() {
        // 定时任务1的执行逻辑
        System.out.println("task1");
    }
}

@Component
public class ScheduledTask2 implements Runnable {
    @Override
    public void run() {
        // 定时任务2的执行逻辑
        System.out.println("task2");
    }
}

@Configuration
public class TaskSchedulerConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("TaskScheduler-");
        scheduler.initialize();
        return scheduler;
    }
}

@Component
@RequiredArgsConstructor
public class ScheduledTaskManager {
    private final TaskScheduler taskScheduler;
    private final ScheduledTaskRepository taskRepository;
    private final ApplicationContext applicationContext;


    @PostConstruct
    public void registerTasks() {
        List<ScheduledTask> tasks = taskRepository.findAllByEnabledTrue();
        tasks.forEach(task -> {
            try {
                Runnable taskInstance = (Runnable) applicationContext.getBean(task.getTaskName());

                taskScheduler.schedule(taskInstance, new CronTrigger(task.getCronExpression()));
            } catch (Exception e) {
                // handle exception
            }
        });
    }
}

标签:task,SpringBoot,private,public,cron,定时,class,表达式
From: https://www.cnblogs.com/loveletters/p/scheduled-config.html

相关文章

  • springboot 注解
    @RequestMapping:定义请求路径url@RequestParam:解决请求参数和形参变量名不一样问题,将指定名称的请求参数赋值给变量@RequestBody:将请求体中的json转换成java对象使用条件:1、有请求体。2、请求数据是json格式。@PathVariable注解:将路径指定占位符对应的参数值赋值给变量。@Response......
  • springboot整合JUnit
    步骤:导入测试对应的starter(springboot帮我们自动导入,纯手工创建时一定记得自己导入)测试类使用@SpringBootTest修饰使用自动装配的形式添加要测试的对象名称:@SpringBootTest类型:测试类注解位置:测试类定义上方作用:设置JUnit加载的SpringBoot启动类范例:@SpringBoot......
  • springboot请求响应
    springboot请求响应1.什么是请求?响应?请求:获取请求数据响应:设置响应数据2.原始方法获取请求数据Controller方法形参中声明HttpServletRequest对象调用对象的getParameter(参数名)这种方式复杂繁琐//@RequestMapping("/simpleParam")//原始方式//创建请求对......
  • Springboot JSON整合—官方原版
    SpringBoot提供与三个JSON映射库的集成:GsonJacksonJSON-BJackson是首选和默认库。一、Jackson提供了Jackson的自动配置,Jackson是springbootstarterjson的一部分。当Jackson在类路径上时,会自动配置一个ObjectMapperbean。提供了几个配置财产,用于自定义ObjectMapper的配置。1.......
  • Lambda表达式
    LambdanewThread(()->System.out.println("多线程学习....")).start;/**避免匿名内部类定义过多*可以让你的代码看起来整洁*去掉了一些没有意义代码,只留下核心代码***///lambda简化代码过程publicclassTestLambda{  //1.静态内部类  staticclassLike2implem......
  • (4.3)数组、对象及类数组对象,set的用法,正则表达式的常用方法,蓝桥杯备赛-(生成数组、数
    1.1数组、对象及类数组对象1.数组:​ 数组是有序的数据集合,其中的索引值从0开始递增,并且数组有length属性,可以获取数组内的元素个数,其中的值可以是任何的数组类型。2.对象:​ 对象是无序的是由一个或多个键值对组成的数据集合,对象没有length属性。3.伪数组(类数组对象):​ ......
  • 怎么在springboot中配置https证书的详细教程
    前言由于小程序需要https,然后之前申请的域名过期了,用了两年由于忘记续费要将域名赎回居然要1200....想了一下之前还有另一个域名,干脆就用这个域名弄个二级域名出来,所以二级域名建立出来后需要在springboot项目上开启https访问废话不多说,开整在阿里云新建二级域名这个......
  • C语言再学习 -- 运算符与表达式
    分三部分来讲一、左值与右值参看:左值与右值首先我们需要理解左值和右值的定义:左值指的是如果一个表达式可以引用到某一个对象,并且这个对象是一块内存空间且可以被检查和存储,那么这个表达式就可以做为一个左值。      右值指的是引用了一个存储在某个内存地址里的数据。从上面......
  • SpringBoot启动异常的错误①
    java:无法访问org.springframework.boot.SpringApplication错误的类文件:/D:/maven/repository/org/springframework/boot/spring-boot/3.0.5/spring-boot-3.0.5.jar!/org/springframework/boot/SpringApplication.class类文件具有错误的版本61.0,应为52.0 2023-04......
  • 【功能与技巧】promethues通过记录规则持久化查询,存储rules表达式查询结果为采集指标
    一、查询持续性到目前为止,我们只是在表达式浏览器中运行查询。虽然查看该查询的输出很方便,但结果仍然是临时存储在Prometheus服务器上,我们可以通过以下三种方式使查询持久化: *记录规则:根据查询创建新指标*报警规则:从查询生成警报*可视化:使用Grafana等仪表板可视化查询......