获取Cron表达式的执行间隔时间

在工作中遇到了一个问题,需求是:某监控数据有多个监控指标,不同指标的更新间隔不同,但都是以 cron 表达式记录。需要按照指标中的最短更新间隔时间来更新此数据的监控状态。于是问题就来到了如何根据可变参数设置定时任务以及如何将 cron 表达式转化为以毫秒为单位的 Long 对象。

1. Cron 表达式介绍

CRON表达式的格式是一个字符串,共有六个字段,分别代表秒、分、小时、日期、月份、星期。每个字段都可以使用通配符、范围、逗号分隔的列表以及"/"取模符号等来表示时间规则。CRON表达式包含了六个部分,分别表示任务执行的时间点。这些部分被空格分隔开,依次表示:

秒(0 - 59) 钟(0 - 59)时(0 - 23)日(1 - 31)月(1 - 12)星期(0 - 6,0表示星期日)

例如:

序号CRON表达式含义
10 * * * * ?每小时的0分0秒执行任务
20 */5 * * * *每隔5分钟执行一次任务
30 */10 * * * *每隔10分钟执行一次任务
40 */15 * * * *每隔15分钟执行一次任务
50 5 0 * * *每天凌晨0点5分0秒执行一次任务

详细介绍参考:CRON表达式,让你轻松掌握定时任务设置

2. 根据 Cron 表达式获取执行间隔时间

    public static void main(String[] args) throws ParseException {
        List<String> cronList = List.of("0 0/10 * * * ?", "0 0/5 * * * ?", "0 0/1 * * * ?");
        String shortestExpression = findShortestIntervalCronExpression(cronList);
        System.out.println("Cron 表达式中间隔时间最短的是:" + shortestExpression + ",执行间隔为:" + getIntervalBetweenExecutions(shortestExpression));
    }

    //获取多个cron表达式中执行间隔最短的
    public static String findShortestIntervalCronExpression(List<String> cronExpressions) {
        long minInterval = Long.MAX_VALUE;
        String shortestExpression = null;

        for (String expression : cronExpressions) {
            try {
                CronExpression cron = new CronExpression(expression);
                Date date = new Date();
                long time = date.getTime();
                long interval = cron.getNextValidTimeAfter(date).getTime() - time;
                if (interval < minInterval) {
                    minInterval = interval;
                    shortestExpression = expression;
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        return shortestExpression;
    }

    //根据cron表达式获取其执行间隔时间的long对象
    public static long getIntervalBetweenExecutions(String cronExpression) {
        try {
            CronExpression cron = new CronExpression(cronExpression);
            Date now = new Date();
            Date nextExecutionTime = cron.getNextValidTimeAfter(now);
            Date followingExecutionTime = cron.getNextValidTimeAfter(nextExecutionTime);
            return followingExecutionTime.getTime() - nextExecutionTime.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
            return -1;
        }
    }

3. 根据可变参数设置定时任务

@Configuration
@Slf4j
public class ScheduledTask{

    @Bean
    public ScheduledExecutorService scheduledExecutorService() {
        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("ScheduledTask-%d").build();
        return new ScheduledThreadPoolExecutor(2, threadFactory);
    }

    //根据自己实际业务需求,获取执行间隔时间的方法getInterval()
    @Autowired
    private MyService myService;

    @PostConstruct
    public void init() {
        scheduledExecutorService().scheduleAtFixedRate(() -> {
            //... 编写自己的任务代码
        }, 0, myService.getInterval(), TimeUnit.MILLISECONDS);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值