最近系统有个需求,执行一个定时任务发送待办事项,一年有六次,分别为每季度第一个工作日、第二季度和第四季度结束后的第十个工作日,可头疼坏了
还好我们系统有个工作日表,于是思路就是先查询出每季度的第一天,然后在表里查出大于此日期的第一个工作日,然后利用cronUtil转换成cron表达式,开启定时任务就ok了。

下面附上查询季度第一天的sql

/* 本季度的第一天 */
concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)
/* 下个季度的第一天 */
date_add(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM curdate()),1) + interval QUARTER(curdate())*3-1 month),interval 1 day )
/* 本半年度的第一天   我的需求是这样,你们可以自由变动*/
concat(year(curdate()),'-07-01')
/* 明年半年度的第一天 */
concat(year(date_add(curdate(),interval 1 year )),'-07-01')
/* 查询本季度第一个工作日    需要先有个工作日表哈*/
select 日期from 工作日表where 日期>=concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)  and 是否为工作日=1 limit 1

查询出来的日期通过cronUtil转换成cron表达式,下面附上cronUtil

package com.ncamc.sfa.schedule.util;import java.text.SimpleDateFormat;
import java.util.Date;/****  功能描述:日期转换cron表达式*/
public class CronUtil {/****  功能描述:日期转换cron表达式* @param date* @param dateFormat* @return*/public static String formatDateByPattern(Date date, String dateFormat){SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);String formatTimeStr = null;if (date != null) {formatTimeStr = sdf.format(date);}return formatTimeStr;}/**** @param date  : 时间点* @return*/public static String getCron(Date  date){String dateFormat="ss mm HH dd MM ?";return formatDateByPattern(date, dateFormat);}
}

注意:spring的scheduled的cron不能有年份,如果需要年份,需要合并quartz来实现了

由于我的需求是每个季度的第一个工作日,有可能今年跟下一年的季度第一个工作日是不一样的,所以定时任务也不能写死,这就需要在每次定时任务执行的时候,要修改此任务的cron,也就是获取相应任务的线程id,先停止任务,然后放入新的cron重新启动任务,可以参考我写的上一篇文章。
可参考这个:
https://blog.csdn.net/success321/article/details/116985433

spring定时任务cron为每季度第一个工作日转换为cron表达式相关推荐

  1. Spring定时任务@Scheduled注解使用方式浅窥(cron表达式、fixedRate和fixedDelay)

    1.开篇 spring的@Scheduled定时任务相信大家都是十分熟悉.最近在使用过程中发现了一些问题,写篇文章,和大家分享一下.结论在最后,不想看冗长过程的小伙伴可以直接拉到最后看结论. 2.简单 ...

  2. Spring定时任务(Cron表达式)

    定时任务 在线Cron表达式生成器: https://cron.qqe2.com/ 一.SpringBoot自带的定时任务 解决:使用异步任务 + 定时任务来完成定时任务不阻塞的功能 定时任务 1.@ ...

  3. spring定时任务 时间配置cron表达式

    1.Spring quartz 1.1 单纯针对时间的设置规则 org.springframework.scheduling.quartz.CronTriggerBean允许你更精确地控制任务的运行时 ...

  4. Spring定时任务@Scheduled注解使用配置方式(cron表达式、fixedRate和fixedDelay)

    Spring定时任务@Scheduled注解使用配置方式(cron表达式.fixedRate和fixedDelay) 序言: 个人推荐一个很方便的在线Cron生成器(网页版):https://qqe2 ...

  5. Quartz动态改变Cron表达式,来实现动态执行Spring定时任务

    Quartz定时器非常强大,但是有时候我们想要不重就能动态的改变Cron表达式的值. 这样我们可以在配置文件中(当然数据库也可以)配置一个表达式的值. 每次想改变表达式的值的时候手动修改配置文件中的表 ...

  6. Spring定时任务注解@Scheduled+@EnableAsync用法详解(简单说明+应用场景+demo源代码+执行过程分析)

    @Scheduled 由Spring定义,用于将方法设置为调度任务,可实现方法的周期或定时执行.想单独使用Scheduling,需引入spring-context这个依赖.spring-boot-st ...

  7. Spring定时任务的几种实现

    Spring定时任务的几种实现 spring框架 quartz spring spring-task 定时任务 注解 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信 ...

  8. (转)Spring定时任务的几种实现

    Spring定时任务的几种实现 博客分类: spring框架 quartzspringspring-task定时任务注解  Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要 ...

  9. Spring定时任务@scheduled多线程的使用(@Async注解)

    1.开篇 在Spring定时任务@Scheduled注解使用方式浅窥这篇文章里面提及过,spring的定时任务默认是单线程的,他在某些场景下会造成堵塞,那么如果我们想让每一个任务都起一条线程去执行呢? ...

最新文章

  1. Vue-CLI + Webpack 搭建 Vue 项目最全分析
  2. python 堆排序的两种实现
  3. python扑克牌洗牌_python:面向对象基本知识(二)用类方法实现斗地主洗牌发牌...
  4. 模态对话框与非模态对话的几种销毁方法与区别
  5. 【期外】 (一)关于LSH :局部敏感哈希算法
  6. 操作系统内存分配算法_操作系统基础45-伙伴系统和slab内存分配
  7. 硬件反垃圾邮件网关|反垃圾邮件软件产品|反垃圾邮箱邮件系统
  8. 华为鸿蒙5g售价,华为首款5G手机售价公布,余承东透露鸿蒙将用于连接家庭设备...
  9. 单独学java_自学Java的几大误区是什么
  10. excel使用教程_如何系统地学习Excel?
  11. Docker环境调优
  12. creo数控编程怎么样_CREO 3.0中文版数控加工高手必备118招
  13. Greasy Fork 视频网页全屏脚本
  14. Elasticsearch实现内容精确匹配查询
  15. 字节面试杂谈——操作系统
  16. docker(五):更新容器映射端口
  17. 求和:1/3+3/5+5/7+7/9+………..+97/99
  18. 计蒜客 - 蒜头君的任务
  19. 阿里云高级工程师认证证书终于到手了!
  20. python版电报API接入从零到一(有彩蛋)

热门文章

  1. Linux下查找指定日期的文件
  2. 新能源汽车车架号VIN码查询车辆信息
  3. XXL-Job启动源码详解
  4. java事件处理入门
  5. 为什么ArrayList查询效率高,删除效率慢
  6. 在Win10 PC上安装Ubuntu 20.04 系统
  7. 纯前端导出export,复杂表格表头合并,表头数据部分动态,
  8. 微信小程序:购物车总结(商品左右联动)
  9. 微信小程序相册-笔记1
  10. 通俗理解卡尔曼滤波(无人驾驶感知融合的经典算法)