首页 > 其他分享 >聊聊项目中定时任务的处理方式

聊聊项目中定时任务的处理方式

时间:2023-02-05 23:44:57浏览次数:42  
标签:任务 添加 线程 聊聊 定时 执行 数据

  一个项目中一般都少不了定时任务,主要用来处理一些特殊的任务,有的是只执行一次的

定时任务,有的是周期循环执行的定时任务。可根据项目需要来选择定时任务类型。自己参与

开发的一个项目中,因为很多定时任务都是需要周期执行的,因此选用按周期循环执行的方式。

比如几分钟重载一次主表数据,重载数据字典表数据,定时更新主表数据状态,定时更新缓存

数据到数据库中的定时任务等等。因此在项目最开始设计的时候,架构人员就考虑使用使用

周期性定时任务来处理各种任务。

  整体的大致思路是在项目启动的时候,立马启动固定的线程数,比如18个线程,然后让

这些线程去轮流执行定时任务,创建方式为Executors.newFixedThreadPool(20)。这种方式是

阿里巴巴的《Java开发手册》中推荐的创建线程的一种方式。创建完线程池后,下一步就是

使用线程对象去定时执行任务,可以传入一些参数,比如延迟启动时间,执行间隔时间,需要

执行的任务对象等等。最后一步最重要的,就是写定时任务处理类,定时任务类需要实现Runnable

接口,然后重写run方法,接下来主要的定时任务逻辑都写在run方法中。

  定时任务类中可能会查询数据库数据,或者是引用其他的service服务类来处理业务逻辑,这时

需要添加一个@Component注解即可将这个类交给Spring统一处理,也能自动注入需要使用的其他类。

自己最近写的一个定时任务也是同样的处理方式。数据的处理流程为,使用定时任务1将符合条件的

表A中的数据定时添加到内存中;使用定时任务2将符合要求的表A的数据,按照一定的规则添加到

表B中,并且将表B返回的ID添加到redis队列中;使用定时任务3从redis队列中获取数据,如果队列

中有数据,则进行后续处理,将表B中的数据按照一定的规则添加到表C。这样整个业务流程都串起来,

用户登录系统后直接查询表C的数据即可。

  自己写好功能后,反反复复地进行测试,发现一些问题,比如定时任务在一个周期内只想时间过长,

还未执行完成,下一次的执行任务又开始执行。这显然是不符合要求的,那怎么解决呢?看过同事以前

写的代码,解决办法为添加分布式锁。自己立马去修复这个问题,对于需要添加分布式锁的两个定时任务

立马添加分布式锁,执行之前先获取锁,如果获取到锁则执行定时任务,没有获取到锁这不执行任务。

经过测试问题解决。第二个问题是,执行时间间隔的问题,本地开发环境只有单个服务器在运行,测试

环境中也只有一台服务器运行,都没问题,可是生产环境上有多台服务器在运行,定时任务的执行时间

就需要从新分配。比如某个定时任务计划是10s执行一次,生产环境有5台,就需要将间隔时间设置

为50s执行一次,不然可能出现的问题就是执行频率远远大于10s。因为是多台服务器在同时执行定时

任务,而且开始执行的时间还不一致,所及执行时间间隔需要慎重计算。

  曾经参与开发过的项目中,有的会有一个单独的定时任务项目,用来执行各种可配置的定时任务,

当然这些都是根据具体项目来选用和开发的。以上就是关于定时任务执行的整个设计思路,有其他

更好建议的小伙伴,欢迎留言讨论。

标签:任务,添加,线程,聊聊,定时,执行,数据
From: https://www.cnblogs.com/yilangcode/p/17094205.html

相关文章

  • C/C++数据结构课程设计任务书[2023-02-05]
    C/C++数据结构课程设计任务书[2023-02-05]数据结构课程设计任务书13周一、目的课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结......
  • Linux进程和计划任务管理
    Linux进程和计划任务管理一、程序和进程的关系1、程序保存在硬盘、光盘等个质中的可执行代码和数据文件中静态保存的代码2、进程在CPU及内存中运行的程序代码动态执......
  • 关于clearInterval后重新启动定时器的问题
    假设有这样一个定时器:letauto=setInterval(right,1000)clearInterval(auto)此时如果想重启定时器auto,应当这样写//正确写法auto=setInterval(right,1000)//......
  • stm32定时器定时中断
    项目:使用定时器内部时钟实现计数功能。代码:Timer.c#include"stm32f10x.h"externuint16_tNum;//定时器初始化函数voidTimer_Init(void){ //打开TIM2外设时......
  • 【托盘图标】任务栏托盘图标间距变大
    问题的表现未禁用驱动的时候 禁用驱动后原因向日葵安装了触摸屏驱动处理方式禁用触摸屏驱动参考博文https://blog.csdn.net/gong842087571/article/details/107......
  • 「 每日一练,快乐水题 」1450. 在既定时间做作业的学生人数
    文章目录​​......
  • linux定时任务
    #查看当前定时任务执行规则crontab-l#查看定时任务执行日志tail-f/var/log/cron#编辑定时任务规则,下面规则是每周1,1点执行/root/test/下的clean_file脚本crontab-e0......
  • js:定时器setInterval、clearInterval的使用
    定时器:可以在固定时间间隔,重复调用一个函数文档https://developer.mozilla.org/zh-CN/docs/Web/API/setInterval常用的语法//设置定时器varintervalID=setInterv......
  • 《2023年电力安全监管重点任务》中的网络安全工作要求
    近日,国家能源局综合司印发《2023年电力安全监管重点任务》(以下简称《重点任务》),明确电力安全监管目标,对今年的安全工作进行了部署。2023年电力安全监管目标是杜绝重大以上电......
  • js 定时器
    开启定时器setInterval(()=>{},1000)间隔1000毫秒执行一次执行setTimeout(()=>{},1000)延迟在1000毫秒后执行一次关闭定时器(不区分定时器种类)clearInterval......