Spring Boot Schedule 定时任务

SpringBoot系列:Spring Boot定时任务Spring Schedule Spring Schedule是Spring提供的定时任务框架,相较于Quartz,Schedule更加简单易用,在中小型应用中,对于大部分需求,Schedule都可以胜任。 一、Spring Schedule使用演示 在SpringBoot使用Spring Schedule非常简单,因为SpringBoot自身的starter中已经集成了Schedule,而不需要我们做更多的处理。 使用@Ena... 阅读详情

Spring Boot Schedule

Spring Boot 定时任务,常用的几种任务调度:

  1. Timer,简单无门槛,一般也没人用。
  2. spring @Scheduled 注解,一般集成于项目中,小任务很方便。
  3. 开源工具 Quartz,分布式集群开源工具,以下两个分布式任务应该都是基于Quartz实现的,可以说是中小型公司必选,当然也视自身需求而定。
  4. 分布式任务 XXL-JOB,是一个轻量级分布式任务调度框架,支持通过 Web 页面对任务进行 CRUD 操作,支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,支持在线配置调度任务入参和在线查看调度结果。

Timer

  1. 按照固定的频率去执行一个任务,不能指定时间
public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        // 安排指定的任务在指定的时间开始进行重复的固定延迟(10毫秒)执行。这里是每3秒执行一次
        timer.schedule(timerTask, 10, 3000);
    }
}

ScheduledExecutorService

和 timer 类似

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 参数:1、任务体 2、首次执行的延时时间
        //      3、任务执行间隔 4、间隔时间单位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

@Sechedule 注解标记的定时任务

  1. @EnableScheduling 在配置类上使用,开启计划任务的支持(类上)
  2. @Scheduled 来声明这是一个任务,包括 cron, fixDelay, fixRate 等类型(方法上,需先开启计划任务的支持)
  • fixedRate ( 开始 - 开始 )是配置上一次任务执行开始到下一次执行开始的时间间隔,不会等待上一次任务执行完成就会调度下一次任务,将其放入等待队列中。
  • fixedDelay ( 结束 - 开始 )是配置的上一次任务执行结束到下一次执行开始的间隔时间,也就是说会等待上一次任务执行结束后,延迟间隔时间,再执行下一次任务。
  • cron 任务执行的cron表达式 0/1 * * * * ?
  • zone cron表达式解析使用的时区,默认为服务器的本地时区,使用java.util.TimeZone#getTimeZone(String)方法解析 GMT-8:00
  • fixedDelay 上一次任务执行结束到下一次执行开始的间隔时间,单位为ms 1000
  • fixedDelayString 上一次任务执行结束到下一次执行开始的间隔时间,使用java.time.Duration#parse解析 PT15M
  • fixedRate 以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间,单位为ms,若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务 2000
  • fixedRateString 与fixedRate逻辑一致,只是使用java.time.Duration#parse解析 PT15M
  • initialDelay 首先任务执行的延迟时间 1000
  • initialDelayString 首次任务执行的延迟时间,使用java.time.Duration#parse解析 PT15M
  1. @Sechedule(cron = "", zone="")
  2. @Sechedule(fixedDelay = "", zone="")
  3. @Sechedule(fixedDelayString = "", zone="")
  4. @Sechedule(fixedRate = "", zone="")
  5. @Sechedule(fixedRateString = "", zone="")
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
   String CRON_DISABLED = "-";
   String cron() default "";  //类似于corn表达式,可以指定定时任务执行的延迟及周期规则
   
   String zone() default "";  //指明解析cron表达式的时区。

   long fixedDelay() default -1;  // end - start 在最后一次调用结束和下一次调用开始之间以固定周期(以毫秒为单位)执行带注解的方法。(要等待上次任务完成后)
   String fixedDelayString() default "";  //同上面作用一样,只是String类型

   long fixedRate() default -1;  // start - start 在调用之间以固定的周期(以毫秒为单位)执行带注解的方法。(不需要等待上次任务完成)
   String fixedRateString() default "";  //同上面作用一样,只是String类型

   long initialDelay() default -1;  //第一次执行fixedRate()或fixedDelay()任务之前延迟的毫秒数 。
   String initialDelayString() default "";  //同上面作用一样,只是String类型
}
cron 表达式格式:
    {秒数}    {分钟}     {小时}    {日期}     {月份}                      {星期}            {年份(可为空)}
    {0-59}   {0-59}    {0-23}   {1-31}     {1-12 or JAN-DEC}         {1-7 or SUN-SAT}   {empty,1970-2099}
    {, - * /}                   {, - * ? / L W C}                    {, - * ? / L C #}  {, - * /}

# 每隔5秒执行一次
@Scheduled(cron = "*/5 * * * * ?")
# 每隔1分钟执行一次
@Scheduled(cron = "0 */1 * * * ?")
# 每天23点执行一次
@Scheduled(cron = "0 0 23 * * ?")
# 每天凌晨1点执行一次
@Scheduled(cron = "0 0 1 * * ?")
# 每月1号凌晨1点执行一次
@Scheduled(cron = "0 0 1 1 * ?")
# 每月最后一天23点执行一次;
@Scheduled(cron = "0 0 23 L * ?")
# 每周星期天凌晨1点执行一次
@Scheduled(cron = "0 0 1 ? * L")
# 在26分、29分、33分执行一次
@Scheduled(cron = "0 26,29,33 * * * ?")
# 每天的0点、13点、18点、21点都执行一次
@Scheduled(crom = "0 0 0,13,18,21 * * ?")
  • , :表示列出枚举值。 例如在 分 使用5,20,则意味着在5和20分 每分钟触发一次。
  • - :表示范围。 例如在 分 使用5-20,表示从5分到20分钟每分钟触发一次。
  • * :表示匹配该域的任意值。 例如在 分 使用*,即表示每分钟都会触发事件。
  • / :表示起始时间开始触发,然后每隔固定时间触发一次。 例如在分域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次。
  • ? :只能用在周和日。它也匹配域的任意值,但是实际不会,因为周和日会相互影响。 例如在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法:13 13 15 20 * ?,其中最后一位只能用?,而不能使用*,如果使用 *表示不管星期几都会触发,实际上并不是这样。
  • L :表示最后,只能出现日和周。 例如在 日 使用 5L,意味着在最后的一个星期四触发。
  • W :表示有效工作日(周一到周五),只能出现在周域,系统将在离指定日期的最近的有效工作日除法事件。 例如:在 日 使用 5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。
  • # :用于确定每个月第几个星期几,只能出现在周。 例如在4#2,表示某月的第二个星期三。
  • LW :这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

Spring 动态修改 Cron

优点:能够动态修改
缺点:单一定时任务

  1. 实现动态定时任务,就需要借助 Spring 的 SchedulingConfigurer 接口,该方式可以实现动态时间,定时任务。
  2. 在 configureTasks 方法中,ScheduledTaskRegistrar 通过 addTriggerTask 来添加触发器任务,从而去执行。
  3. addTriggerTask 方法有两个参数,一个是要执行得任务,一个是触发器。
@Component
public class CronSchedule implements SchedulingConfigurer {
 
  @Override
  public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
    // 通过数据库获取所有任务,所有任务通过
    List<ScheduleSetting> scheduleList = xxxxxxMapper.getScheduleList();
    System.out.println(scheduleList.size());
    if (CollectionUtils.isNotEmpty(scheduleList)){
      for (ScheduleSetting s : scheduleList){
        scheduledTaskRegistrar.addTriggerTask(getRunnable(s), getTrigger(s));
      }
    }
  }
 
  /**
   * 转换首字母小写
   *
   * @param str
   * @return
   */
  public static String lowerFirstCapse(String str) {
    char[] chars = str.toCharArray();
    chars[0] += 32;
    return String.valueOf(chars);
  }
 
  private Runnable getRunnable(ScheduleSetting scheduleSetting){
    return new Runnable() {
      @Override
      public void run() {
        Class<?> clazz;
        try {
          clazz = Class.forName(scheduleSetting.getBeanName());
          String className = lowerFirstCapse(clazz.getSimpleName());
          Object bean = SpringContext.getBean(className);
          Method method = ReflectionUtils.findMethod(bean.getClass(), scheduleSetting.getMethodName());
          if (StringUtils.isNotEmpty(scheduleSetting.getMethodParams())) {
            ReflectionUtils.invokeMethod(method, bean, scheduleSetting.getMethodParams());
          } else {
            ReflectionUtils.invokeMethod(method, bean);
          }
        } catch (ClassNotFoundException e) {
          e.printStackTrace();
        }
      }
    };
  }
 
  private Trigger getTrigger(ScheduleSetting scheduleSetting){
    return new Trigger() {
      @Override
      public Date nextExecutionTime(TriggerContext triggerContext) {
        CronTrigger trigger = new CronTrigger(scheduleSetting.getCronExpression());
        Date nextExec = trigger.nextExecutionTime(triggerContext);
        return nextExec;
      }
    };
  }
}
# task-config.ini:
printTime.cron=0/10 * * * * ?
@Data
@Slf4j
@Component
@PropertySource("classpath:/task-config.ini")
public class ScheduleTask implements SchedulingConfigurer {
  
    @Value("${printTime.cron}")
    private String cron;
  
    @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);
  
                // 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
                PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
                Date nextExecutionTime = periodicTrigger.nextExecutionTime(triggerContext);
                return nextExecutionTime;
            }
        });
    }
}
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
  
    private final ScheduleTask scheduleTask;
  
    @Autowired
    public TestController(ScheduleTask scheduleTask) {
        this.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";
    }
}

Spring Boot 集成 Quartz

SQL 文件路径:quartz-2.3.2.jar!\org\quartz\impl\jdbcjobstore\tables_mysql_innodb.sql

基本概念

  • 任务 Job

    • 工作任务调度的接口,每一个job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法
    • 实例在Quartz中的生命周期中
      • 每次调度器执行job时它在调用execute方法前,会创建一个新的job实例
      • 当调用完成后,关联的job对象实例会被是释放,释放的实例会被垃圾回收机制回收
  • 触发器 Trigger

    • 负责触发任务
    • 主要包含两种:SimpleTrigger 和 CronTriggerr
  • 调度器 Schedule

    • Scheduler是任务的调度器,会将任务job和触发器Trigger结合,负责基于Trigger设定的时间执行job

集成步骤

  • 引入依赖
<!-- quartz定时任务 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
  • 新建Job任务
    • 这里需要注意使用的是 Job 类,不能使用自定义方法,需要后边修改。
@Slf4j
public class CustomJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info("Hello Job执行时间: " + new Date());
    }
}
  • 定义一个定时任务
public class QuartzTest {

    public static void main(String[] args) throws Exception {
        // 1. 创建一个JobDetail,把实现了Job接口的类邦定到JobDetail 构建者模式 绑定job withIdentity这里起一个唯一的名字
        JobDetail jobDetail = JobBuilder.newJob(CustomJob.class)
                .withIdentity("job1") // 唯一标识
                .build();
        // 2.创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行 repeatForever重复
        SimpleTrigger trigger = TriggerBuilder
            .newTrigger()
            .withIdentity("trigger1") // 唯一标识
            .startNow() // 立即生效
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInSeconds(2) // 每2秒执行一次
            .repeatForever()) // 一直重复执行
            .build();

		// SimpleTrigger 简单触发器
		Date startTime = DateBuilder.nextGivenSecondDate(new Date( ),15);  // 在当前时间15秒后运行
		// 创建一个SimpleTrigger实例,指定该Trigger在Scheduler中所属组及名称。
		// 接着设置调度的时间规则.当前时间15秒后运行,每10秒运行一次,共运行15次
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
            .startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(10)
                    .withRepeatCount(15)
            ).build();
    
        // CronTrigger - Cron触发器
        // 每两秒执行
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
            CronScheduleBuilder.cronSchedule("/2 * * * * ?")
        ).build();
        
        // 日期触发
        // 每一分钟执行
        DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
            DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(1, DateBuilder.IntervalUnit.MINUTE)
        ).build();
        
        // 日历触发
        // 每两秒执行
        CalendarIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
            CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(2, DateBuilder.IntervalUnit.SECOND)
        ).build();

        // 3.创建schedule调度器并执行   StdSchedulerFactory 工厂模式
        StdSchedulerFactory factory = new StdSchedulerFactory();
        // 获取调度器实例
        Scheduler scheduler = factory.getScheduler();
        // 开启调度器
        scheduler.start();
        // 把SimpleTrigger和JobDetail注册给调度器,通过触发器开始每2秒一次重复执行。
        scheduler.scheduleJob(jobDetail, trigger);
        // 关闭调度器
        // scheduler.shutdown();
    }
}
  • 面向对象,定时任务对象
    • CustomJob.java jobClassName 对应执行的方法(面前是类名/类路径,后续增加 Bean)
    • 任务 JobDetail
      • name 任务名称 jobName
      • group 任务分组 jobGroup
      • JobBuilder 是⽣成 JobDetail 的唯⼀标识 JobKey,暂时保存在 JobBuilder 中
    • 触发器 Trigger
      • name 任务名称 jobName
      • group 任务分组 jobGroup
      • TriggerBuilder ⽣成 Trigger 的唯⼀标识 TriggerKey,暂时保存在 TriggerBuilder 中
      • startNow() 从当前时间开始
      • startAt() 传⼊的时间早于cron表达式设置的时间,则将会触发⼀次,但不管cron表达式是否会多次执⾏,都只会触发⼀次
      • endAt() 结束
      • withSchedule
        • SimpleScheduleBuilder 简单的触发器
          • RepeatForever:指定触发器将无限期重复
          • WithRepeatCount:指定重复次数
        • CalendarIntervalScheduleBuilder 日期触发器
          • WithInterval:指定要生成触发器的时间单位和间隔
          • WithIntervalInHours:指定要生成触发器的间隔按小时来
          • WithIntervalInMinutes:指定要生成触发器的间隔按分钟来
          • WithIntervalInSeconds:指定要生成触发器的间隔按秒来
          • WithIntervalInDays:指定要生成触发器的间隔按日来
          • WithIntervalInWeeks:指定要生成触发器的间隔按周来
          • WithIntervalInMonths:指定要生成触发器的间隔按月来
          • WithIntervalInYears:指定要生成触发器的间隔按年来
        • DailyTimeIntervalScheduleBuilder 日期触发类(日)
        • CronScheduleBuilder 基于Cron表达式的Trigger,使⽤最多、功能最强⼤的Trigger。所以对象 cronException CRON表达式
      • WithDescription(“remark”) 添加说明
      • UsingJobData:添加Job数据,底层是key-vaule的JobDataMap,和JobBuilder里面的一样
      • ForJob:指定对应关系的JobKey,四个重载方法,底层都是指定一个JobKey
@Data
public class JobInfo{

    private String cronExpression;
    private String jobClassName;
    private String triggerGroupName;
    private String triggerName;
    private String jobGroupName;
    private String jobName;
    private Date nextFireTime;
    private Date previousFireTime;
    private Date startTime;
    private String timeZone;
    private String status;
    private String remark;
}
// 创建一个触发器
var trigger = TriggerBuilder.Create().Build();
// Trigger立即触发
TriggerBuilder.newTrigger().startNow().build();
// Trigger指定时间触发
TriggerBuilder.newTrigger().startAt(time).build();
// Trigger指定周期时间触发,即corn方式
TriggerBuilder.newTrigger().startNow().endAt(endTime)
    .withSchedule(dailyAtHourAndMinute(start.getHours(), start.getMinutes()))
    .build();

Spring Boot 集成 XXL-JOB

部署项目 XXL-JOB

XXL-JOB 分布式任务调度中心
项目源码

    1. 执行/xxl-job/doc/db目录下的数据库初始化脚本
    1. 修改数据库配置
    1. 启动运行
    1. 访问 http://127.0.0.1:9080/xxl-job-admin
    1. 用户密码分别为:admin/123456

Spring Boot 集成

  • 引入依赖
<!-- xxl-job-core 分布式任务定时调度工具 -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.1</version>
</dependency>
  • 启动类上添加注解@EnableScheduling

  • 添加配置类

@Configuration
@RequiredArgsConstructor
public class BeanConfig {

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        // 管理系统地址
        xxlJobSpringExecutor.setAdminAddresses("http://127.0.0.1:8080/xxl-job-admin");
        // 执行器的名称
        xxlJobSpringExecutor.setAppname("xxlJob");
        // 地址
//        xxlJobSpringExecutor.setAddress(address);
//        xxlJobSpringExecutor.setIp(ip);
        // 内部连接使用的端口  通过 38801 与 XXL-JOB 管理系统关联
        xxlJobSpringExecutor.setPort(38801);
//        xxlJobSpringExecutor.setAccessToken(accessToken);
        // 日志文件路径
        xxlJobSpringExecutor.setLogPath("logs/xxl-job/first-study");
        // 日志保留 7 天 
        xxlJobSpringExecutor.setLogRetentionDays(7);
        return xxlJobSpringExecutor;
    }
}
使用 ChatGPT/Copilot 提升前端开发效率的 N 种方式 typescript// 输入:根据这个 JavaScript 对象,生成完整的 TypeScript 类型定义id: '123',stock: 50,},// ChatGPT 生成:id: string;discount?: number;// 可选属性// 只读属性// 更进一步,生成 Zod schema 用于运行时验证:});}),});AI 代码助手真正的革命性不在于它能生成多少代码,而在于它改变了我们解决问题的方式。 阅读详情

相关推荐

Polars简明基础教程一:Polars快速入门

在这个例子中,我们将添加一个列,其中包含每个舱位中乘客的最大年龄。在Python中(而不是特指Polars),当我们将代码包裹在括号中时,我们可以在新行上调用一个新方法——在这种情况下是select。在这里,我们看到一个使用表达式API的简单示例,其中我们在select语句中选择Pclass、Name和Age列(我们将在第3节中深入了解select语句)。表达式是一个函数,它接受一个Series(或DataFrame中的列)作为输入,并返回一个Series(或DataFrame中的列)。

sosogod的博客 3880

SpringBoot 使用Schedule定时框架

一、引言 在开发过程中,我们往往需要实现一些定时功能比如执行定时任务、定时发送统计数据等,现在虽然有java有很多类似Saturn(唯品会自主研发的分布式的定时任务的调度平台),但是在一些比较小的项目而又没有搭建好的分布式定时任务中台时,可以使用Schedule定时任务框架,使用起来简单而且就算分布式项目也可以通过使用分布式锁将Schedule实现分布式定时任务功能。 二、Schedule定时框架的使用 1、添加依赖 使用IDEA的Spring Initiallzr...

GyaoG的专栏 2341

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 279

cron表达式常用例子

cron表达式常用例子 cron 表达式的写法老是记不住,当然也是我根本不想记得原因所致。 这里记录一下,有用到就来看一下 规则 cron(秒 分钟 小时 日 月 星期 年) cron 的表达式的例子 (1)0/2 * * * * ? 表示每2秒 执行任务 (2)0 0/2 * * * ? 表示每2分钟 执行任务 (3)0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务 (4...

Little_fxc的博客 4722

手把手教你配置MAX96712解串器:从I2C地址分配到PWM帧同步

本文详细解析了MAX96712解串器在自动驾驶视觉链路中的核心配置流程。从I2C地址分配、GMSL2数据流映射到实现多摄像头精准同步的PWM帧同步触发,手把手指导工程师构建高可靠性的图像传输系统,并提供了实用的Linux调试技巧与问题排查思路。

weixin_29297127的博客 926

qt下使用grpc编程(2) —— 练手!自己改的一个简单小例子!1

(1)在研究了grpc官方提供的helloworld例程后,自己试着写了个小程序。 (2)编写proto文件。 proto文件用于定义服务和消息,用protobuf的语法编写,protobuf是一种通信协议,详细请百度。下面附上源码: syntax = "proto3"; option java_multiple_files = true; option java_pac

u011099079的博客 3925

Spring Boot使用Schedule实现定时任务

)控制的每10秒执行一次的定时任务,是每10秒整执行一次,即一分钟内,如果当前秒数能够整除10,则执行定时任务,或理解为每分钟0秒开始执行,10秒后执行下一次,执行完一分钟后,再从0秒开始。对于上面那些简单的定时任务,定时任务的corn表达式写死在代码里,如果要改动表达式,需要修改代码,重新打包发布,比较麻烦。我们可以看到,对于cron表达式 来说,如果业务代码执行时间小于定时任务间隔时间,那么定时任务每10秒执行一次,且不受业务代码影响,无论业务代码执行多久,定时任务都是10秒执行一次;

null 1万+

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有:FairyGUI,VSCode代码环境涉及到了:LuaVSCode插件:EmmyLua在编写FairyGUI编辑器菜单前,了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能实现的,插件中我使用的是lua环境模板。导入编辑器的LuaAPI,文件可以在FairyGUI-Editor源码的插件目录中找到。接下来将通过功能来说明对应的API作用。

Aili_Xiao的博客 4500

SpringBoot Schedule的三种使用方式

SpringBoot Schedule的三种使用方式

qq_31794615的博客 4878

PHP实现获取本机ip及mac地址​(附完整源码)

PHP实现获取本机ip及mac地址​(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 354

组合导航 | RTK、IMU与激光雷达组合导航算法:原理、实现与验证

当激光雷达噪声增加至0.1m时,系统位置RMSE仅上升18%,验证了滤波算法的鲁棒性[110]:融合方案在RTK信号丢失30秒后,位置误差仍控制在1.5m内,显著优于IMU单独导航[28]:ESKF框架能有效建模传感器误差特性,状态向量需包含外参与时间偏移等关键参数。:传感器标定精度直接影响系统性能,建议每3个月进行一次重新标定。:IMU预积分与特征匹配是系统实时性的关键瓶颈,需重点优化。:维持10秒窗口内的关键帧,平衡精度与实时性[132]:特征匹配占总耗时的65%,可通过。

尘世冰封的专栏 943

spring boot项目中处理Schedule定时任务

项目中,因为使用了第三方支付(支付宝和微信支付),支付完毕后,第三方支付平台一般会采用异步回调通知的方式,通知商户支付结果,然后商户根据通知内容,变更商户项目支付订单的状态。一般来说,为了防止商户项目自身因为一些特殊原因,比如正好当时网络状态不稳定,商户回调接口无法访问,或者商户回调接口出现异常。第三方支付平台,一般会发送多次请求来尽量确保通知到商户系统。 但是,总会有各种各样的情况,导致,第三...

跨链技术践行者 1万+

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

定时任务schedule(spring boot )

定时任务schedule(spring boot ) 1. 定时任务实现方式:SpringBoot自带的Scheduled,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,本文主要介绍。 执行方式:单线程(串行)------------多个定时任务,一个跑完,其他的才能跑多线程(并行) 2. 创建定时任务 @Comp...

诸葛子房的博客 373

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

推荐一款高效定时任务框架:Schedule-Spring-Boot-Starter

推荐一款高效定时任务框架:Schedule-Spring-Boot-Starter schedule-spring-boot-starter增强SpringBoot Schedule,开发中间件以zookeeper为注册中心扩展为分布式任务调度系统,接入方式接单易用,目前实现功能如下; 多机器部署任务 统一控制中心启停 宕机灾备,自动启动执行 实时检测任务执行信息:部署数量、任务总量、...

gitblog_00060的博客 567

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring boot自带定时任务Schedule

Spring boot创建定时任务步骤: 1、开启定时任务 SpringBoot为我们内置了@Scheduled定时任务,找到入口程序添加注解@EnableScheduling @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] ar...

Four_Leaved_Clover的博客 644

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring Boot中使用定时任务schedule

Spring Boot中使用定时任务schedule

adminwxc的博客 5009

Spring Boot (七):整合定时任务schedule

介绍 定时任务用于定时去执行某项操作,如:跑批数据,报表等。 一、配置文件 采用读取配置文件方式经行时间配置 application.properties corn=*/1 * * * * * 二、代码 启动类 package com.guo; import org.springframework.boot.SpringApplication; import org.springframewor...

西部落酋长的博客 439

音视频开发入门指南:从采集编码到同步传输的核心链路与避坑实践

音视频开发涉及像素格式、采样率、时间戳等基础概念,其核心原理围绕采集、编码、传输、解码、渲染的数据流转展开。掌握这些技术能帮助开发者构建直播、视频会议、点播等应用,解决音画同步、网络抖动等工程难题。在实际场景中,从视频链路入手更直观,通过平台原生API跑通YUV处理、H.264编解码、PTS/DTS同步等环节,再逐步深入传输协议与性能优化。本文梳理了音视频入门必须掌握的知识点与实操路径,帮助开发者少走弯路。

weixin_34166847的博客 259

php schedule 只执行一次_Spring Boot使用Schedule实现定时任务

0. 开发环境 IDE:IntelliJ IDEA 2017.1 x64 jdk:1.8.0_91 Spring Boot:2.1.1.RELEASE 1. 简单定时任务对于一些比较简单的定时任务,比如固定时间间隔执行固定方法,在标准Java方法上注解@Scheduled即可package cn.wbnull.springbootdemo.schedule; import cn.wbnull.s...

weixin_39887846的博客 390

Spring Boot Schedule定时任务

spring boot的入口类Application.java中,添加@EnableScheduling注解,允许支持schedule @SpringBootApplication @EnableScheduling public class Application{ public static void main(String[] args) { SpringApp...

JinGo 405
上一篇: React与Vue组件生命周期以及钩子函数
下一篇: Java_Reflection Java 反射
Roobert_Chao
博客等级 码龄9年 89粉丝 94原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值