侧边栏壁纸
  • 累计撰写 12 篇文章
  • 累计创建 4 个标签
  • 累计收到 6 条评论
标签搜索

间隔时间转为cron定时任务表达式

请叫我雯子小姐的小爷
2022-08-01 / 0 评论 / 1 点赞 / 325 阅读 / 976 字

背景

最近遇到一个场景,需要每N分钟执行一次任务,分享一下用定时任务实现的一种方式

cron表达式构成

*    *    *    *    *    *    *
-    -    -    -    -    -    -
|    |    |    |    |    |    |
|    |    |    |    |    |    + year [optional]
|    |    |    |    |    +----- day of week (1 - 7) sun,mon,tue,wed,thu,fri,sat
|    |    |    |    +---------- month (1 - 12) OR jan,feb,mar,apr ...
|    |    |    +--------------- day of month (1 - 31)
|    |    +-------------------- hour (0 - 23)
|    +------------------------- min (0 - 59)
+------------------------------ second (0 - 59)

实现思路

  1. 根据时间间隔获取下次执行时间的cron表达式
  2. 定时任务完成后删除自身
  3. 创建新的定时任务

根据时间间隔获取下次执行时间的cron表达式

private String minuteToCron(int syncIntervalInt) {
    String dateFormat = "ss mm HH dd MM ?";

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, syncIntervalInt);

    return sdf.format(calendar.getTime());
}

流程demo

public void addCronTask() {
    String syncInterval = 1440
    String cron = minuteToCron(syncInterval);

    if (CronUtil.getScheduler().getTask(CRON_TASK_NTP_SYNC) != null) {
        CronUtil.remove(CRON_TASK_NTP_SYNC);
    }

    CronUtil.schedule(CRON_TASK_NTP_SYNC, cron, () -> {
            // 删除同步任务
            CronUtil.remove(CRON_TASK_NTP_SYNC);
            // 创新新的任务
            addCronTask();
    });
}
1