Java实现自动定时任务配置并判断当天是否需要执行示例

news2024/11/26 19:47:03

最近接到一个需求,用户要能配置一个定时循环的任务,就是和手机闹钟循环差不多,设置好比如周一、周二、周三,那么在这几天内这个任务就需要自动执行

需求不复杂,首先我需要判断当前是周几,当然用户说了让我看手机闹钟的循环规则,我看了下还有法定工作日和法定节假日这些
所以我们先写个工具类来判断当前日期是否需要执行

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.MonthDay;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Sakura
 * @date 2024/6/20 9:48
 */
public class SchedulerTaskUtil {

    public enum RepeatCycle {
        DAILY,         // 每天
        MONTHLY,       // 每月
        HOLIDAYS,      // 法定节假日
        WORKDAYS,      // 法定工作日
        MONDAY,        // 周一
        TUESDAY,       // 周二
        WEDNESDAY,     // 周三
        THURSDAY,      // 周四
        FRIDAY,        // 周五
        SATURDAY,      // 周六
        SUNDAY         // 周日
    }

    private static final Set<MonthDay> HOLIDAYS = new HashSet<>();

    static {
        // 初始化法定节假日 2024 这个需要定期维护有些麻烦
        HOLIDAYS.add(MonthDay.of(1, 1));  // 元旦
        HOLIDAYS.add(MonthDay.of(2, 10)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 11)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 12)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 13)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 14)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 15)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 16)); // 春节
        HOLIDAYS.add(MonthDay.of(2, 17)); // 春节
        HOLIDAYS.add(MonthDay.of(4, 4)); // 清明节
        HOLIDAYS.add(MonthDay.of(4, 5)); // 清明节
        HOLIDAYS.add(MonthDay.of(4, 6)); // 清明节
        HOLIDAYS.add(MonthDay.of(5, 1)); // 劳动节
        HOLIDAYS.add(MonthDay.of(5, 2)); // 劳动节
        HOLIDAYS.add(MonthDay.of(5, 3)); // 劳动节
        HOLIDAYS.add(MonthDay.of(5, 4)); // 劳动节
        HOLIDAYS.add(MonthDay.of(5, 5)); // 劳动节
        HOLIDAYS.add(MonthDay.of(6, 8)); // 端午节
        HOLIDAYS.add(MonthDay.of(6, 9)); // 端午节
        HOLIDAYS.add(MonthDay.of(6, 10)); // 端午节
        HOLIDAYS.add(MonthDay.of(9, 15)); // 中秋节
        HOLIDAYS.add(MonthDay.of(9, 16)); // 中秋节
        HOLIDAYS.add(MonthDay.of(9, 17)); // 中秋节
        HOLIDAYS.add(MonthDay.of(10, 1)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 2)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 3)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 4)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 5)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 6)); // 国庆节
        HOLIDAYS.add(MonthDay.of(10, 7)); // 国庆节
        // 其他假日可以继续添加
    }

    private Set<RepeatCycle> repeatCycles;

    public SchedulerTaskUtil(String repeatCyclesStr) {
        this.repeatCycles = Arrays.stream(repeatCyclesStr.split(","))
                .map(String::trim)
                .map(String::toUpperCase)
                .map(RepeatCycle::valueOf)
                .collect(Collectors.toSet());
    }

    public boolean shouldExecuteToday() {
        LocalDate today = LocalDate.now();
        DayOfWeek dayOfWeek = today.getDayOfWeek();
        MonthDay monthDay = MonthDay.from(today);

        if (repeatCycles.contains(RepeatCycle.DAILY)) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.MONTHLY) && today.getDayOfMonth() == 1) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.HOLIDAYS) && HOLIDAYS.contains(monthDay)) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.WORKDAYS) && !HOLIDAYS.contains(monthDay)
                && dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.MONDAY) && dayOfWeek == DayOfWeek.MONDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.TUESDAY) && dayOfWeek == DayOfWeek.TUESDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.WEDNESDAY) && dayOfWeek == DayOfWeek.WEDNESDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.THURSDAY) && dayOfWeek == DayOfWeek.THURSDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.FRIDAY) && dayOfWeek == DayOfWeek.FRIDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.SATURDAY) && dayOfWeek == DayOfWeek.SATURDAY) {
            return true;
        }

        if (repeatCycles.contains(RepeatCycle.SUNDAY) && dayOfWeek == DayOfWeek.SUNDAY) {
            return true;
        }

        return false;
    }

    public static void main(String[] args) {
        // 示例:任务在周一和周三执行
        String repeatCyclesStr = "MONDAY,WEDNESDAY";
        SchedulerTaskUtil scheduler = new SchedulerTaskUtil(repeatCyclesStr);

        if (scheduler.shouldExecuteToday()) {
            System.out.println("Today is a repeat day, generate the task.");
            // 生成任务的逻辑
        } else {
            System.out.println("Today is not a repeat day.");
        }
    }
}

执行一下测试方法

在这里插入图片描述
显示今天不是需要重复的一天,因为今天星期四

在这里插入图片描述

给它加上周四

在这里插入图片描述

再执行就对了

在这里插入图片描述
剩下的就好说了,我们只需要加一个定时器就可以

import com.yokea.pro.task.mapper.TaskMapper;
import com.yokea.pro.task.model.po.Task;
import com.yokea.pro.task.util.SchedulerTaskUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author Sakura
 * @date 2024/06/20 15:24
 */
@Component
@EnableScheduling
@Slf4j
public class ScheduledTask {

//    每隔1分钟执行一次:0 */1 * * * ?
//    每天22点执行一次:0 0 22 * * ?
//    每月1号凌晨1点执行一次:0 0 1 1 * ?
//    每月最后一天23点执行一次:0 0 23 L * ?
//    每周周六凌晨3点实行一次:0 0 3 ? * L
//    在24分、30分执行一次:0 24,30 * * * ?

    @Autowired
    private TaskMapper taskMapper;


    /**
     * @description: 每天凌晨开始生成周期循环任务
     * @author: Sakura
     * @date: 2024/06/20 16:27
     */
    @Scheduled(cron = "0 0 0 * * ?") // 0 0 0 * * ? 每天0点启动
    @Async
    public void recurrentTasks() {
        log.info("定时生成周期循环任务程序启动——————————————————————————————————————————");
        try {
            // 先获取需要循环启动的周期任务
            List<Task> periodicTaskList = taskMapper.getPeriodicTaskList();
            for (Task task : periodicTaskList) {
                // 判断当前任务当天是否需要重复执行
                SchedulerTaskUtil schedulerTask = new SchedulerTaskUtil(task.getCycle());
                if (schedulerTask.shouldExecuteToday()) {
                    log.info("定时生成周期循环任务程序启动,任务ID:{}", task.getId());
                }
            }
        } catch (Exception e) {
            log.error("定时生成周期循环任务程序启动", e);
        }
    }


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北航数据结构与程序设计图部分选填题

一、 抓两个关键信息&#xff1a;无向图&#xff0c;邻接表。无向图中&#xff0c;边&#xff08;vi&#xff0c;vj&#xff09;要在vi的链表中记录一次&#xff0c;再以&#xff08;vj&#xff0c;vi&#xff09;的形式在vj的链表中记录一次。 每个边都要记录两次&#xff0c…

大创项目推荐 酒店评价的情感倾向分析

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/post…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1&#xff0c;预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

采用java+B/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点

采用javaB/S架构开发的工业级UWB&#xff08;Ultra-Wideband&#xff09;室内定系统源码UWB定位系统技术接口及技术特点 UWB&#xff08;Ultra-Wideband&#xff09;定位技术本身并不直接连接蓝牙或其他无线通信技术进行定位。然而&#xff0c;在实际应用中&#xff0c;UWB定位…

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取…

LeetCode刷题之HOT100之LRU缓存

2024/6/21 酷暑难耐&#xff0c;离开空调我将不知道能否《活着》&#xff0c;昨天跑步感觉全身的热无法排出去&#xff0c;出门那种热浪一阵一阵打过来&#xff0c;一点风都舍不得给我。早早的来到实验室&#xff0c;也没多早&#xff0c;九点哈哈&#xff0c;做题啦&#xff0…

Linux【实操篇-文件目录类命令】

05【实操篇-文件目录类命令】 1.pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 到现在为止&#xff0c;我们还不知道自己在系统的什么地方。在浏览器上&#xff0c;我们能够通过导航栏上的url&#xff0c;了解到自己在互联网上的具体坐标。相似的…

GNSS是什么意思?探索全球导航卫星系统的应用与发展

GNSS是什么意思&#xff1f;GNSS是全球导航卫星系统&#xff08;Global Navigation Satellite System&#xff09;的缩写&#xff0c;它借助于多颗位于地球轨道上的卫星&#xff0c;通过接收和处理卫星信号来实现高精度的全球定位和导航。GNSS系统不仅包括美国的GPS&#xff08…

C# 语言在AGI 赛道上能做什么

自从2022年11月OpenAI正式对外发布ChatGPT依赖&#xff0c;AGI 这条赛道上就挤满了重量级的选手&#xff0c;各大头部公司纷纷下场布局。原本就在机器学习、深度学习领域占据No.1的Python语言更是继续稳固了自己AI一哥的位置。凭借着Microsoft 和 OpenAI 长期以来一直是紧密相连…

CVPR 2024 以物体为中心的多感知具身大语言模型

CVPR 2024发表了关于多感知以对象为中心的具身大型语言模型&#xff08;MultiPLY&#xff09;的研究论文&#xff0c;该模型在3D环境中进行编码和交互。 提出MultiPLY是一个多感知的具身大型语言模型&#xff08;LLM&#xff09;&#xff0c;能够将视觉、听觉、触觉和温度等多…

【netty】三万字详解!JAVA高性能通信框架,关于netty,看这一篇就够了

目录 1.概述 2.hello world 3.EventLoop 4.channel 4.1.同步 4.2.异步 4.3.调试 4.4.关闭 4.5.为什么要用异步 5.future 6.promise 7.pipeline 8.byteBuf 8.1.创建 8.2.内存模式和池化 8.2.1.内存模式 8.2.2.池化 8.3.组成 8.4.操作 8.4.1.读写 8.4.2.释放…

钢琴块小游戏(附源码)

代码结构 app.png是游戏运行主界面的图片&#xff08;可以加载自己喜欢的主界面图片&#xff09; Assets文件夹里面装的是一些需要用到的游戏图片 全部都可以替换为自己喜欢的图片 Fonts里面装的是 Sounds文件夹里面装的是 一 . 主程序代码 1.运行这个代码使得游戏开始 2.主界面…

深入理解Vue3.js响应式系统设计之调度执行

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

Linux 一键部署 Nginx1.26.1 + ModSecurity3

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

知网期刊《新课程导学》投稿要求及收稿方向

知网期刊《新课程导学》投稿要求及收稿方向 知网期刊《新课程导学》作为一份专注于教育领域的学术期刊&#xff0c;一直以来都致力于为广大学术研究者提供一个高质量、高水平的学术交流平台。为了保证期刊的学术质量&#xff0c;编辑部对投稿要求和收稿方向有着严格的规定。 首…

Postman接口测试详解与进阶

Postman是一个功能强大的接口测试工具&#xff0c;它主要用于模拟用户发起的各类HTTP请求&#xff0c;从而验证响应中的结果数据是否和预期值相匹配。以下是关于Postman的详细介绍&#xff1a; Postman是一个功能全面、使用便捷、支持多种HTTP请求类型、提供丰富的测试数据和配…

铝型材挤压车间的数字孪生应用

图扑利用数字孪生技术&#xff0c;在铝型材挤压车间实现了生产线的全方位实时监控和优化。通过高精度三维建模和数据可视化&#xff0c;提升了效率和管理透明度&#xff0c;促进了智能制造和资源配置的优化。

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…