quartz工具类含倒计时

简介: quartz工具类含倒计时

分享一个自己写的Quartz工具类,可以轻松实现倒计时功能:

import cn.hutool.core.date.DateUtil;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import org.dromara.streamquery.stream.core.collection.Lists;
import org.quartz.*;
import org.quartz.core.jmx.JobDataMapSupport;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.Set;

@UtilityClass
public class QuartzUtil {

    @SneakyThrows
    public static Scheduler startTaskAt(LocalDateTime time, JobKey jobKey,
                                        Map<String, Object> jobDataMap, Class<? extends Job> jobClazz) {
        var scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.deleteJob(jobKey);
        var jobDetail = JobBuilder.newJob().ofType(jobClazz).withIdentity(jobKey)
                .usingJobData(JobDataMapSupport.newJobDataMap(jobDataMap)).build();
        var trigger = TriggerBuilder.newTrigger().withIdentity(jobKey.getName(), jobKey.getGroup())
                .startAt(DateUtil.date(time)).build();
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
        return scheduler;
    }

    public static Scheduler startTaskTimeSeconds(Long timeSeconds, JobKey jobKey,
                                                 Map<String, Object> jobDataMap, Class<? extends Job> jobClazz) {
        try {
            var scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.deleteJob(jobKey);
            var jobDetail = JobBuilder.newJob().ofType(jobClazz).withIdentity(jobKey)
                    .usingJobData(JobDataMapSupport.newJobDataMap(jobDataMap)).build();
            var trigger = TriggerBuilder.newTrigger()
                    .withIdentity(jobKey.getName(), jobKey.getGroup())
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(timeSeconds.intValue()))
                    .startNow().build();
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
            return scheduler;
        } catch (SchedulerException e) {
            throw new ApiServerException(e);
        }
    }


    public static void deleteJob(JobKey readyStartJobKey) {
        try {
            var scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.deleteJob(readyStartJobKey);
        } catch (SchedulerException e) {
            throw new ApiServerException(e);
        }
    }

    public static void deleteJobs(String groupName) {
        try {
            var scheduler = StdSchedulerFactory.getDefaultScheduler();
            Set<JobKey> jobKeys = scheduler.getJobKeys(GroupMatcher.groupEquals(groupName));
            scheduler.deleteJobs(Lists.ofColl(jobKeys));
        } catch (SchedulerException e) {
            throw new ApiServerException(e);
        }
    }

    public static void pauseJob(JobKey key) {
        try {
            var scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.pauseJob(key);
        } catch (SchedulerException e) {
            throw new ApiServerException(e);
        }
    }
}

对应的单元测试:

import lombok.SneakyThrows;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class QuartzUtilTest {

    @Test
    @SneakyThrows
    @Disabled("sleep")
    void startTaskAtTest() {
        var obj = new AtomicInteger();
        Map<String, Object> map = Map.of("test", obj);
        var jobKey = JobKey.jobKey("startTaskAtTest", "test");
        var time = LocalDateTime.now().plus(Duration.ofSeconds(3));
        QuartzUtil.startTaskAt(time, jobKey, map, StartTaskAtTestJob.class);
        TimeUnit.SECONDS.sleep(4);
        Assertions.assertEquals(1, obj.get());
    }

    @Test
    @SneakyThrows
    @Disabled("sleep")
    void startTaskTimeSecondsTest() {
        var obj = new AtomicInteger(3);
        Map<String, Object> map = Map.of("countdown", obj);
        var jobKey = JobKey.jobKey("startTaskTimeSecondsTest", "test");
        QuartzUtil.startTaskTimeSeconds(3L, jobKey, map, StartTaskTimeSecondsTestJob.class);
        TimeUnit.SECONDS.sleep(4);
        Assertions.assertEquals(0, obj.get());
    }

    public static class StartTaskAtTestJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            var jobDataMap = context.getMergedJobDataMap();
            var test = jobDataMap.get("test");
            if (test instanceof AtomicInteger obj) {
                obj.set(1);
            }
        }
    }

    public static class StartTaskTimeSecondsTestJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            var jobDataMap = context.getMergedJobDataMap();
            var countdown = jobDataMap.get("countdown");
            if (countdown instanceof AtomicInteger obj) {
                obj.set(obj.decrementAndGet());
            }
        }
    }

}
相关文章
|
存储 JSON 缓存
十行代码让日志存储降低80%
日志是系统中熵增最快的一个模块,它承载了业务野蛮生长过程中的所有副产品。本文介绍了一个日志治理案例,围绕降本和提效两大主题,取得一定成效,分享给所有渴望造物乐趣的同学。
54191 23
十行代码让日志存储降低80%
|
3月前
|
消息中间件 JSON 监控
痛点:数据量太大怎么办?用API分页查询+增量解决
在处理大数据量API同步时,采用分页查询与增量更新策略可有效避免性能瓶颈与服务限流,提升同步效率与稳定性。本文详解四种分页方式(页码、游标、时间戳、ID分页)与三种增量机制(时间戳、版本号、日志订阅),并提供组合策略与优化技巧,助你高效完成数据同步。
|
12月前
|
数据采集 缓存 Java
Python vs Java:爬虫任务中的效率比较
Python vs Java:爬虫任务中的效率比较
|
存储 Java 数据库连接
技术好文:quartz基本介绍和使用
技术好文:quartz基本介绍和使用
440 0
|
7月前
|
弹性计算 异构计算
阿里云服务器多少钱一小时?在哪查询1小时价格表?
阿里云服务器按量付费,1小时起计费。如2核2G的ECS经济型e实例仅0.094元/小时。不同配置价格各异,例如GPU计算型gn6v(64核256G)高达211.68元/小时。查询价格可访问阿里云ECS页面定制配置。包年包月更划算,2核2G服务器低至99元/年
373 4
|
11月前
|
Ubuntu Linux 开发工具
docker 如何使用编译安装?应该注意一些什么?
【10月更文挑战第31天】docker 如何使用编译安装?应该注意一些什么?
425 3
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用问题之如何查看所有的表结构
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
258 0
|
网络协议 Linux 网络安全
linux服务器防火墙的开启及关闭
linux服务器防火墙的开启及关闭
1588 1
产品入门第六讲:Axure中继器
产品入门第六讲:Axure中继器
257 0
|
关系型数据库 Shell 网络安全
【shell 脚本编程】430 行代码,带你使用脚本一键部署 LAMP
【shell 脚本编程】430 行代码,带你使用脚本一键部署 LAMP
267 0