掌桥专利:专业的专利平台
掌桥专利
首页

一种定时任务调度方法和设备

文献发布时间:2024-01-17 01:14:25


一种定时任务调度方法和设备

技术领域

本发明涉及计算机技术领域。更具体地,涉及一种定时任务调度方法和设备。

背景技术

在计算机的广泛应用与发展中,任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作。

实现任务有很多种方式,要确保自身的轻量级,在不使用第三方框架的情况下,传统的定时器无法动态的添加或者删除任务。只能由开发者在开发中设定好具体的执行间隔或者执行时间,这显然是无法满足对任务定时执行的动态管理。

因此,需要提供一种任务调度方法、设备和存储介质。

发明内容

本发明的一个目的在于提供一种定时任务调度方法和设备。

为达到上述目的,本发明采用下述技术方案:

本发明第一方面提供一种定时任务调度方法,包括:

部署任务调度系统,所述任务调度系统包括调度中心、缓存、数据库和缓存式数据库;

根据分类算法将新建的任务分别存储到缓存、数据库或缓存式数据库中;

根据获取规则,获取缓存、缓存式数据库或数据库中任务的数据,为每一个任务配置执行线程,通过所述执行线程执行任务,并将所述任务转发给用户。

可选地,该方法还包括

在使用所述调度系统时,

清除调度中心所有的任务配置执行线程的任务,并将调度中心初始化;

设置第一设定时长刷新一次缓存的数据;

在每天0点时,刷新缓存式数据库,具体为将当前时刻数据库中第二设定时长内的数据加载到缓存式数据库第三设定时长失效有序集合中,并将当前时刻数据库中上一个第二设定时长中的脏数据清除;

所述第一设定时长、第二设定时长和第三设定时长为小时级,且所述第二设定时长大于所述第三设定时长,所述第三设定时长大于所述第一设定时长。

可选地,该方法还包括

在添加任务时,根据分类算法将添加的任务分别存储到缓存、数据库或缓存式数据库中。

可选地,所述获取规则包括:

在当天的缓存式数据库中获取当前任务执行时刻这一秒的所有执行线程的任务数据;

如果有任务,却未从缓存式数据库中获取到任务的数据,则从数据库中补偿获取;

如果从数据库中未获取到任务的数据,则清除调度中心和缓存中所述任务和所述任务的记录信息。

可选地,所述获取规则还包括

在当天的缓存式数据库中获取当前时刻到第四设定时长后的任务的数据到缓存中,并与调度中心中正在运行的任务进行对比;

如果调所述度中心中有所述获取到的任务,则跳过;

没有,则新增任务并加载到所述调度中心;

所述第四设定时长为小时级,且小于第三设定时长,大于第一设定时长。

可选地,所述根据分类算法将任务分别存储到缓存、数据库或缓存式数据库中,包括

在创建任务时,根据任务执行时间,

将任务执行时间小于第五设定时长的任务加载到调度中心;

将任务执行时间大于第五设定时长,小于读取缓存式数据库加载时间区间为第四设定时长的任务,加载到调度中心、缓存、缓存式数据库和数据库中;

将任务执行时间大于读取缓存式数据库加载时间区间为第四设定时长,小于刷新缓存式数据库第三设定时长的任务,加载到缓存式数据库和数据库中;

将任务执行时间大于刷新缓存式数据库第三设定时长的任务加载到数据库中;

所述第五设定时长为分钟级。

可选地,所述方法在添加任务时,根据分类算法将任务分别存储到缓存、数据库或缓存式数据库中包括

将任务执行时间小于第五设定时长的任务加载到调度中心;

将任务执行时间大于第五设定时长,小于读取缓存式数据库加载时间区间为第四设定时长的任务,加载到调度中心、缓存、缓存式数据库和数据库中;

将任务执行时间大于读取缓存式数据库加载时间区间为第四设定时长,小于刷新缓存式数据库第三设定时长的任务,加载到缓存式数据库和数据库中;

将任务执行时间大于刷新缓存式数据库第三设定时长的任务加载到数据库中。

可选地,所述方法在添加任务时,还包括

设置添加的任务数据在缓存式数据库中失效时间为小时级的第六设定时长。

可选地,所述方法还包括

删除任务时,查询需要删除的任务的执行时刻是否在调度中心的其他线程中有任务需要执行,

若没有,则删除调度中心、缓存、缓存式数据库和数据库中所述任务的数据,

若有,则删除缓存式数据库和数据库中所述执行线程的任务的数据。

本发明第二方面提供一种定时任务调度设备,包括

部署模块,用于部署任务调度系统,所述任务调度系统包括调度中心、缓存、数据库和缓存式数据库;

所述调度中心,用于根据获取规则,获取缓存、缓存式数据库或数据库中任务的数据,还用于为每一个任务配置执行线程;

分类模块,用于根据分类算法将新建的任务分别存储到缓存、数据库或缓存式数据库中;

任务转发模块,用于将所述调度中心中执行的任务转发给用户

任务删除模块,用于查询需要删除的任务的执行时刻是否在调度中心的其他线程中有任务需要执行,若没有,则删除调度中心、缓存、缓存式数据库和数据库中所述任务的数据,若有,则删除缓存式数据库和数据库中所述执行线程的任务的数据。

本发明第三方面提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现本发明第一方面提供的方法。

本发明第四方面提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明第一方面提供的方法。

本发明的有益效果如下:

本发明创造的技术是要解决不依赖第三方框架的情况下,无法动态的设定任务执行的问题。本发明能够删除已经存在的任务,并且在缓存中只存放两个小时内需要执行的任务。整个调度中心中26小时内任务则由redis(缓存式数据库)存储,长时间后执行的任务由Oracle(数据库)保存,Oracle身为根数据库,会存储非直接发送的所有任务,直到每晚12点检测发现超过提醒时间26小时后被清除。

附图说明

下面结合附图对本发明的具体实施方式作进一步详细的说明。

图1示出本发明所述方法的流程图。

具体实施方式

为了更清楚地说明本发明,下面结合优选实施例和附图1对本发明做进一步的说明。附图中相似的部件以相同的附图标记进行表示。本领域技术人员应当理解,下面所具体描述的内容是说明性的而非限制性的,不应以此限制本发明的保护范围。

一种定时任务调度方法,包括:

部署任务调度系统,所述任务调度系统包括调度中心、缓存、数据库和缓存式数据库;

根据分类算法将新建的任务分别存储到缓存、数据库或缓存式数据库中;

根据获取规则,获取缓存、缓存式数据库或数据库中任务的数据,为每一个任务配置执行线程,通过所述执行线程执行任务,并将所述任务转发给用户。

可选地,该方法还包括

在使用所述调度系统时,

清除调度中心所有的任务配置执行线程的任务,并将调度中心初始化;

设置第一设定时长(1小时)刷新一次缓存的数据;

在每天0点时,刷新缓存式数据库,具体为将当前时刻数据库中第二设定时长(26小时)内的数据加载到缓存式数据库第三设定时长(24小时)失效有序集合中,并将当前时刻数据库中上一个第二设定时长(26小时)中的脏数据清除;

所述第一设定时长、第二设定时长和第三设定时长为小时级,且所述第二设定时长大于所述第三设定时长,所述第三设定时长大于所述第一设定时长。

可选地,该方法还包括

在添加任务时,根据分类算法将添加的任务分别存储到缓存、数据库或缓存式数据库中。

可选地,所述获取规则包括:

在当天的缓存式数据库中获取当前任务执行时刻这一秒的所有执行线程的任务数据;

如果有任务,却未从缓存式数据库中获取到任务的数据,则从数据库中补偿获取;

如果从数据库中未获取到任务的数据,则清除调度中心和缓存中所述任务和所述任务的记录信息。

可选地,所述获取规则还包括

在当天的缓存式数据库中获取当前时刻到第四设定时长(2小时)后的任务的数据到缓存中,并与调度中心中正在运行的任务进行对比;

如果调所述度中心中有所述获取到的任务,则跳过;

没有,则新增任务并加载到所述调度中心;

所述第四设定时长(2小时)为小时级,且小于第三设定时长(24小时),大于第一设定时长(1小时)。

可选地,所述根据分类算法将任务分别存储到缓存、数据库或缓存式数据库中,包括

在创建任务时,根据任务执行时间,

将任务执行时间小于第五设定时长(5分钟)的任务加载到调度中心;

将任务执行时间大于第五设定时长(5分钟),小于读取缓存式数据库加载时间区间为第四设定时长(2小时)的任务,加载到调度中心、缓存、缓存式数据库和数据库中;

将任务执行时间大于读取缓存式数据库加载时间区间为第四设定时长(2小时),小于刷新缓存式数据库第三设定时长(24小时)的任务,加载到缓存式数据库和数据库中;

将任务执行时间大于刷新缓存式数据库第三设定时长(24小时)的任务加载到数据库中;

所述第五设定时长(5分钟)为分钟级。

可选地,所述方法在添加任务时,根据分类算法将任务分别存储到缓存、数据库或缓存式数据库中包括

将任务执行时间小于第五设定时长(5分钟)的任务加载到调度中心;

将任务执行时间大于第五设定时长(5分钟),小于读取缓存式数据库加载时间区间为第四设定时长(2小时)的任务,加载到调度中心、缓存、缓存式数据库和数据库中;

将任务执行时间大于读取缓存式数据库加载时间区间为第四设定时长(2小时),小于刷新缓存式数据库第三设定时长(24小时)的任务,加载到缓存式数据库和数据库中;

将任务执行时间大于刷新缓存式数据库第三设定时长(24小时)的任务加载到数据库中。

可选地,所述方法在添加任务时,还包括

设置添加的任务数据在缓存式数据库中失效时间为小时级的第六设定时长(24小时)。

可选地,所述方法还包括

删除任务时,查询需要删除的任务的执行时刻是否在调度中心的其他线程中有任务需要执行,

若没有,则删除调度中心、缓存、缓存式数据库和数据库中所述任务的数据,

若有,则删除缓存式数据库和数据库中所述执行线程的任务的数据。

一种定时任务调度设备,包括

部署模块,用于部署任务调度系统,所述任务调度系统包括调度中心、缓存、数据库和缓存式数据库;

所述调度中心,用于根据获取规则,获取缓存、缓存式数据库或数据库中任务的数据,还用于为每一个任务配置执行线程;

分类模块,用于根据分类算法将新建的任务分别存储到缓存、数据库或缓存式数据库中;

任务转发模块,用于将所述调度中心中执行的任务转发给用户

任务删除模块,用于查询需要删除的任务的执行时刻是否在调度中心的其他线程中有任务需要执行,若没有,则删除调度中心、缓存、缓存式数据库和数据库中所述任务的数据,若有,则删除缓存式数据库和数据库中所述执行线程的任务的数据。

特别地,根据本实施例,上文流程图描述的过程可以被实现为计算机软件程序。例如,本实施例包括一种计算机程序产品,其包括有形地包含在计算机可读介质上的计算机程序,上述计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。

具体的一个实施例,本发明所述方法可以被实现为计算机软件程序。

定时执行功能采用动态任务,在调度中心中添加指定时间执行doTask(DatereminderTime)方法。

ScheduleTask类实现SchedulingConfigurer类,并且

该方法会在启动springboot时执行,进方法先调用RedisTask类中refreshRedis()方法刷新redis缓存信息,然后创建1小时执行一次的任务,该任务执行refresh()方法。

refresh()从redis中获取当前时刻到2小时后的任务数据,并与正在调度中心中的任务进行对比,如果调度中心中

doTask(Date reminderTime)方法会在当天的redis缓存库中获取当前任务执行时刻这一秒的所有任务数据,如果有任务,却没有在redis中获取数据则在数据库中补偿获取,如果数据库中也没有则从调度中心以及记录的futureMap中清除该任务及记录。

有数据则调用send(ListtaskMessages,Boolean isSend)方法进行消息发送。由doTask方法进入的都是任务执行时间距离当前时间大于五分钟,因此清除Oracle,正在运行调度中心记录,调度中心中该任务,任务执行时间距当前时间小于五分钟的直接发送。

在创建任务时,会根据任务执行时间,将任务执行时间小于五分钟的任务直接执行;将距离当前时间大于五分钟小于读库加载时间区间2小时,加载到调度中心,存放进记录集合,加载到redis,入库;将距离当前时间大于读库加载时间区间2小时小于刷缓存时间1天,加载到redis,入库;将距离当前时间大于刷缓存时间1天的直接入库。

RedisTask中的refreshRedisTask()会在每天0点调用refreshRedis()方法,该方法会将目前为止数据库中26小时的数据加载到24小时失效redis有序集合中,并且清除26小时前的脏数据。

addTask(ListtaskDtoList)该方法是添加任务的,每次添加任务都会调用deleteTask(String eventId)清除该代理下的所有的任务,然后调用isSend(ListtaskDtoList)首先对任务数据进行初始化。接着,根据任务执行时间,将任务执行时间距离当前时间小于五分钟的提醒直接发送;将大于五分钟小于读库加载时间区间2小时,加载到调度中心,存放进记录集合,加载到redis,入库;将大于读库加载时间区间2小时小于刷缓存时间1,加载到redis,入库;将大于刷缓存时间1天,直接入库。最后如果redis没有设置失效时间,则设置redis失效为1天。

deleteTask(String eventId)是根据代理id删除该代理相关的任务。该方法会先获取该代理下所有任务,然后校验任务执行时间点是否有其他代理下的任务需要执行,没有则删除调度中心中任务、记录、redis中和Oracle中该日程的任务信息,有则只删除redis中和Oracle中该代理的任务信息。

listTaskMessage(String eventId)是根据代理id获取代理下的任务信息。

本发明,任务信息使用redis缓存并存储为zSet,redis数据库基于内存,相较于关系型数据库有很快的查询效率。

由于当前任务发送要求的实效性,在数据量较大情况下redis可以反映更加迅捷,确保任务执行的实时性。其次本发明将在添加任务时经过算法对任务进行分类存储,将长时间后执行的任务存入数据库而不是直接将任务加载到调度中心,大幅度减轻了服务器压力。根据需要,开发者可以自行设置其中各项时间来匹配平衡自己的业务场景。并且,该程序对可能存在的脏数据进行了定时清理,而且在往缓存加载或者往调度中心加载都留有余量,来确保数据的可靠性,因此如果自行设置时间则需要考虑这一问题。对于已经加载到调度中心的任务则由redis+Oracle双重支撑

以创建智能日历的日程提醒任务为例。

新建记录任务的实体类TimedTaskMessage,其中必须要有cron表达式存储字段,本案例为智能日历,因此还需要日程id字段、提醒时间字段、提前提醒类型字段(1.当时;2.提前5分钟;3.提前10分钟;4.提前30分钟;5.提前1小时;6.提前2小时;7.提前1天;)与被提醒人字段,其中的cron表达式字段为提醒时间转换而来,然后创建实体对应的Oracle表与映射mapper。

创建RedisTask类,声明private final double redisScoreKey=100000000、private TimedTaskMessageMapper taskMapper。撰写refreshRedis()方法,该方法清除26小时前脏数据,并将当前算起26小时之内的任务加载到redis中,redis使用zSet有序集合,其中score值为提醒时间的时间戳缩小redisScoreKey倍,并设置redisKey的过期时间为1天。设置任务refreshRedisTask()为每晚0点执行调用并调用refreshRedis()方法。

创建ScheduleTask类,实现SchedulingConfigurer并注入实体的对应mapper。声明

private final double redisScoreKey=100000000、ConcurrentHashMap>futureMap=new ConcurrentHashMap<>()(用来存储记录调度中心中正在运行的任务)、private ThreadPoolTaskSchedulerthreadPoolTaskScheduler(任务线程池)、private RedisTask redisTask。

然后对线程池进行配置,根据需要@Bean对线程池ThreadPoolTaskScheduler设置个数等配置然后注入声明的threadPoolTaskScheduler中。重写configureTasks(ScheduledTaskRegistrar taskRegistrar)方法,先调用RedisTask中的refreshRedis先将任务刷入redis中缓存。然后添加一个任务用来执行调度中心任务的新增,其定时间隔为1小时执行一次,执行方法为refresh方法。

refresh()方法返回Runnable,重写其中run()方法,首先判断redis中是否有今天的key,没有则调用RedisTask中的refreshRedis()先将任务刷入redis中缓存,有就获取当前时间起2小时内的任务。在获取的任务不为空时,如果调度中心任务记录futureMap为空则新建任务放入调度中心,不为空则判断该任务是否存在于futureMap中,不存在则新建任务放入调度中心。其中创建任务的参数第一个为doTask(Date reminderTime),第二个位new CronTrigger(String expression))(expression是提醒时间的cron表达式)。

doTask(Date reminderTime)方法为业务执行方法,在存储今天数据的redisKey中取出提醒时间精确到秒的一秒内所有的任务,获取方式是根据之前存入的score值获取。当获取任务不为空时调用send(ListtaskMessages,Boolean isSend)提醒发送方法对提醒进行发送,如果为空则再从Oracle中补偿性获取数据,确定该时间点无数据存在从调度中心中清除该任务。

send(ListtaskMessages,Boolean isSend)方法为提醒发送,第一次参数为提醒的集合实体,第二个则用来判断是否是在创建任务时提醒时间已经小于5分钟。首先发送消息,如果isSend为false则证明大于五分钟,则Oracle、redis与调度中心中存在相应记录,需要移除。

addTask(ListtaskDtoList)该方法是添加提醒的,每次添加都会调用deleteTask(String eventId)清除该日程的所有提醒,然后调用isSend(ListtaskDtoList),最后isSend方法返回需要入库的List,在addTask中将其存入Oracle中。

isSend(ListtaskDtoList)方法,首先对提醒数据进行初始化,在isSend方法中还要根据提醒时间,将提醒时间小于五分钟的提醒直接发送;将大于五分钟小于读库加载时间区间2小时,加载到调度中心,存放进记录集合,加载到redis,入库;将大于读库加载时间区间2小时小于刷缓存时间1天,加载到redis,入库;将大于刷缓存时间1天,直接入库。最后如果redis没有设置失效时间,则设置redis失效为1天。

deleteTask(String eventId)是根据日程删除日程相关提醒。该方法会先获取该日程下所有提醒,然后改时间点是否有其他日程需要提醒,没有则删除调度中心中任务、记录、redis中和Oracle中该日程的提醒信息,注意对比redis中数据点的时候对比日程id不能误删其他日程此时间的任务,有则只删除redis中和Oracle中该日程的提醒信息。

listTaskMessage(String eventId)是根据日程获取日程下提醒的messageType,如果需要其他信息,则根据需求更改返回数据即可。

在本发明的描述中,需要说明的是,术语“上”、“下”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

还需要说明的是,在本发明的描述中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定,对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。

相关技术
  • 一种洗涤设备的电机控制方法、装置及一种洗涤设备
  • 一种建立网络资源的设备图谱的方法以及所述设备图谱的使用方法
  • 一种功率控制方法、接收方法、功率分配方法及相关设备
  • 一种设备升级方法及嵌入式设备
  • 一种定时任务调度的优化方法、计算机设备及存储介质
  • 定时任务调度方法、装置、设备及介质
技术分类

06120116079502