关于java定时任务的问题,这种功能用什么技术实现?

是不是入错行了 2021-02-18 11:30:56
之前有个需求就是周一到周五,9点到下午6点调用接口查询在线人数,然后在这个时间段内的插入数据库,我做了,我用的是spring的task,写的cron表达式来实现的。
现在需求变了,希望执行的时间不再仅是周一到周五,因为有时候节假日放假,还有周六日有人加班也要执行这个任务,他把不执行任务的时间(也就是放假的时间,全部写到一张表上),现在希望没在数据库表上的时间再执行定时任务,当然周末默认还是不执行,用什么技术实现?
...全文
2300 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-02-26
  • 打赏
  • 举报
回复
实现方案有两种: 一种是,自定义触发器,在Cron触发器的基础上,对数据库中不执行的时间进行排除,如果当前时间符合触发条件,则触发任务执行; 另一种是,修改任务代码,在任务执行的一开始,先判断当前时间是否包含在数据库中如允许执行的时间范围内,如果是不允许的时间,则直接退出任务。 第二种方案,并不推荐,虽然实现起来较为简单,但是,它破坏了程序结构,不便于以后程序的更新和维护。 还是从触发条件上面着手,自定义一个触发器吧。注意,有可能要缓存一些触发条件和数据,注意数据同步更新的问题。
xiaoxiangqing 2021-02-25
  • 打赏
  • 举报
回复
可以根据假期表设定的时间来运行
哈哈gogo 2021-02-24
  • 打赏
  • 举报
回复
这个一般需要自己实现
湮雨 2021-02-23
  • 打赏
  • 举报
回复
定时任务照样每天执行,额外建立一个节假日模块,手动将法定节假日录入,定时任务内代码外层套if语句,判断系统时间是否在法定节假日内,如果在,代码不执行,如果不在,就执行定时任务内的代码。
  • 打赏
  • 举报
回复
在定时任务上套一层不就好了吗,每天的定时任务检测数据库表是否需要执行就ok了 假如你表里维护的是不执行的假期和执行的周末加班,那你定时任务的cron配置为每天都执行查表任务 如果是周一到周五就判断是否是假期是就不执行,如果是周末就判断是否是加班,如果加班就执行,不是加班就不执行
小灰狼 2021-02-23
  • 打赏
  • 举报
回复
假期表少不了,否则没法实现 因为照楼主的需求,假期谁都没法预测,比如明年、后年,国庆是七天还是五天,清明、五一是哪几天调整,必须要等到当年才由国家出台计划。将来,恢复五一七天长假也是有可能的。 所以,这些数据,必须由运维来设置,维护,他们就是干这个的! 至于说周未要不要设置,这个其实也不复杂,一年里大多数的周六、周日都是正常节假日,其它时间工作日。只有少数几个周六和周日才需要和假日调整。这样设置的工作量也减少很多。 其实个人感觉吧,楼主让运维把一年里每个周未都设置一下也没多少工作量。一年顶多366天,52个星期,累讲104个周六和周日。做个界面排整齐一点,366天全部展示在一个界面里,运维鼠标点100多下,没多少工作量。何况,他们一年只需要设置这么一回。 楼主,你嘴上抹点蜜,说话甜一点,多说点好话,讲讲道理,把运维工作量说轻一点,开发难度说重一点……说不定人家就从了你了
小灰狼 2021-02-22
  • 打赏
  • 举报
回复
个人感觉不用太大改动 spring 的定时任务还是每天执行,上午9点开始到下午6点结束 但是执行任务时,对比放假表,如果当前日期是假期,则啥都不敌就是了
abc4160201 2021-02-21
  • 打赏
  • 举报
回复
学习最优方案、
老王就是我 2021-02-21
  • 打赏
  • 举报
回复
假设,除了执行任务的时间外,需要执行的业务是固定的话,有两种方案: 1、加一张表,里面包含需要重复执行的时间范围和停止阈值之类的,然后每天0点判断今天是否需要执行任务 2、动态创建定时任务,然后动态清除。前端可能不知道定时任务的cron怎么写,但这个不需要前端去写,因为定时任务的时间节点是固定的,写死几个周一二三四五六七让运维去选择就好
i__0o0__ 2021-02-20
  • 打赏
  • 举报
回复
这个还需要什么技术嘛? 定时任务的执行时间直接改成每天的9点到下午6点, 然后在定时任务里面第一行就加个判断,比较当前日期跟表中限定的日期, 如果当前日期在表中就直接return,不在就继续执行呗
wycfight 2021-02-20
  • 打赏
  • 举报
回复
既然有假期表了, 如果不需要动态去维护 最简单的方法 就是每天执行 然后判断当天有没有在假期表中 在就不执行 否则就执行任务 。 太蠢了 哈哈
王大锤· 2021-02-20
  • 打赏
  • 举报
回复
其实你可以尝试定时任务轮询机制不变,但是你定时任务里面要执行的逻辑外面套一层查询,查询你自建表,如果满足条件或者不满足条件来控制到底执行不执行逻辑就行呀!可能我想的比较简单了
Dkodak 2021-02-20
  • 打赏
  • 举报
回复
感觉没有必要,你这个当不知道什么时候触发的时候为什么不会自己创建一个页面按钮去触发,然后正常的就周一到周五去跑定时
wang1hong2lu3 2021-02-19
  • 打赏
  • 举报
回复
现在既然不执行的数据在数据库里面了,那就还是按以前该执行的就执行,提前把不执行的数据取出来就是了,先判断一下是不是要执行,不执行就直接返回了,直接结束,执行就继续, 这样就好了
maradona1984 2021-02-19
  • 打赏
  • 举报
回复
引用 10 楼 是不是入错行了 的回复:
好的,马上换工作, 1.我说了有假期表 2.假期表是运维提前写上去的 3.你一直给我说你的思路,我服了,你那点简单的逻辑我还是懂,一开始问问题的时候就懂 4.我想问的是如何在动态的去控制定时任务 5.你一直说我一直说定时任务,假期表里面你让运维把每年的周末都写上去?里面只有假期或者周末加班的日期,你可能会说:周末你不会判断?赶快给老子换工作吧,哈哈
动态控制定时任务要集成起来更麻烦,而且那只是控制执行/不执行,不能预定义时间,限制颇大,完全不符合你需求,我只是提供一个更可行的方案给你罢了. 当然我从你的描述中看出来你的矛盾在哪,运维不愿意加周末时间,你也不愿意写判断周末的逻辑,这个算是无解了,判断周末难道不更简单吗四行代码搞定啊...我不知道你纠结这个干嘛
未曾有 2021-02-19
  • 打赏
  • 举报
回复
有一种可以设置动态cron表达式的方式,在执行玩一次定时任务之后可可以调用方法替换成新的cron表达式 或者使用调度平台统一管理定时任务
  • 打赏
  • 举报
回复
引用 9 楼 maradona1984 的回复:
[quote=引用 6 楼 是不是入错行了 的回复:][quote=引用 5 楼 maradona1984 的回复:]接上面,我觉得你入行时间较短,估计还是会误解我的意思,你的定时任务就配置成每天执行,而不是周一到周五,是否执行真正的业务逻辑根据这个表的时间配置去判断就好了.
我就是配置的周一到周五,用的cron表达式,但是给我任务的人说,有时候周末会加班,或者假期占了周一到周五任意一天,如果那天没人上班,就没必要执行定时任务,于是就新建了一张假期表,专门约束我之前写的那个定时任务[/quote] 还有没必要执行定时任务的含义是指不去做"9点到下午6点调用接口查询在线人数"这件事情而已,人家的定时任务说的是任务,定不定时给任务的人不在意,既然这个周一到周五的配置已经无法满足需求,框架也没有满足需求的方案提供,那自然就得自己去实现,也就是增加了一张假期表,你自己写代码去判断是否需要查询在线人数这件事情. 说到这份上你还不懂,那我真觉得你的id取的很对,可以考虑换份工作,虽然有点伤人,但每个人都有适合自己的工作,没必要做不适合自己的工作.[/quote] 好的,马上换工作, 1.我说了有假期表 2.假期表是运维提前写上去的 3.你一直给我说你的思路,我服了,你那点简单的逻辑我还是懂,一开始问问题的时候就懂 4.我想问的是如何在动态的去控制定时任务 5.你一直说我一直说定时任务,假期表里面你让运维把每年的周末都写上去?里面只有假期或者周末加班的日期,你可能会说:周末你不会判断?赶快给老子换工作吧,哈哈
maradona1984 2021-02-18
  • 打赏
  • 举报
回复
引用 6 楼 是不是入错行了 的回复:
[quote=引用 5 楼 maradona1984 的回复:]接上面,我觉得你入行时间较短,估计还是会误解我的意思,你的定时任务就配置成每天执行,而不是周一到周五,是否执行真正的业务逻辑根据这个表的时间配置去判断就好了.
我就是配置的周一到周五,用的cron表达式,但是给我任务的人说,有时候周末会加班,或者假期占了周一到周五任意一天,如果那天没人上班,就没必要执行定时任务,于是就新建了一张假期表,专门约束我之前写的那个定时任务[/quote] 还有没必要执行定时任务的含义是指不去做"9点到下午6点调用接口查询在线人数"这件事情而已,人家的定时任务说的是任务,定不定时给任务的人不在意,既然这个周一到周五的配置已经无法满足需求,框架也没有满足需求的方案提供,那自然就得自己去实现,也就是增加了一张假期表,你自己写代码去判断是否需要查询在线人数这件事情. 说到这份上你还不懂,那我真觉得你的id取的很对,可以考虑换份工作,虽然有点伤人,但每个人都有适合自己的工作,没必要做不适合自己的工作.
maradona1984 2021-02-18
  • 打赏
  • 举报
回复
引用 6 楼 是不是入错行了 的回复:
[quote=引用 5 楼 maradona1984 的回复:]接上面,我觉得你入行时间较短,估计还是会误解我的意思,你的定时任务就配置成每天执行,而不是周一到周五,是否执行真正的业务逻辑根据这个表的时间配置去判断就好了.
我就是配置的周一到周五,用的cron表达式,但是给我任务的人说,有时候周末会加班,或者假期占了周一到周五任意一天,如果那天没人上班,就没必要执行定时任务,于是就新建了一张假期表,专门约束我之前写的那个定时任务[/quote] 跟你沟通有点费劲哈~,你这思路有点死,能不能跳出你那个定时任务配置来,把你这个定时任务配置修改成每天都执行,然后再去假期表里查一下今天是否需要统计数据,需要就统计,不需要就不统计. 上面我就指出你的问题在哪,但你这阅读理解的能力怕是也很难理解重点在哪,我也只能复读机般的跟你讲上述的解决方案. 1.修改定时任务配置改成每天都执行. 2.新增一张假期表,定时任务执行时,读取该表,当天是假期的,就不执行统计在线人数的逻辑(人家的意思不是不执行定时任务,只是不去统计并插入,你的问题就在这里,虽然我也无法理解你对问题的理解会卡在这里) 3.这张假期表如何设计,大概就一个日期就好了 4.其他的应该是不需要修改的 还有给你任务的人都已经说成这样了,你还没懂...建议再去咨询下他,尽量做到信息对称,不要怕丢脸,做不出来才丢脸.
  • 打赏
  • 举报
回复
定时器配置成每天执行,然后再代码里去查你的配置表来决定要不要执行业务逻辑
加载更多回复(6)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧