一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

定时任务处理方法及装置、系统、电子设备和存储介质与流程

2021-11-20 03:45:00 来源:中国专利 TAG:


1.本公开涉及计算机技术领域,具体而言,涉及一种定时任务处理方法、定时任务处理装置、定时任务处理系统、电子设备以及计算机可读存储介质。


背景技术:

2.业务系统一般可以由多个业务模块组成,这些业务模块被封装成一个个独立部署的应用,独立维护。在这些业务模块中,通常采用一个定时任务管理用于管理各个模块的任务,而各定时任务管理均需要依赖自身的业务数据和逻辑。
3.如果每个模块中均各自实现的各自模块的定时管理,则可能导致定时功能与业务逻辑耦合在一起,所以定时任务管理中心所要实现的是统一管理这些分布在各个业务模块中的定时任务。
4.现有的定时管理任务技术实现的方式有很多,目前,常用的实现方式包括:通过面向对象编程语言(java语言)自带的功能类实现、通过现有的开源扩特兹公式(quartz)框架实现、通过spring框架的定时任务管理实现等等。
5.需要说明的是,在上述背景技术部分公开的信息仅用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。


技术实现要素:

6.本公开的目的在于提供一种定时任务处理方法、定时任务处理装置、电子设备以及计算机可读存储介质,进而至少在一定程度上克服现有的定时任务管理方法无法实现持久化、无法满足多种类任务调度、使用成本高、风险大的问题。
7.本公开的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本发明的实践而习得。
8.根据本公开的第一方面,提供一种定时任务处理方法,包括:获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中;确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表;解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态;如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。
9.可选的,在获取包括多个定时任务的任务哈希表之前,上述方法还包括:获取第一定时任务的第一延时参数,根据第一延时参数确定第一定时任务在任务哈希表中的第一任务地址;将目标指针当前遍历的节点地址作为当前节点地址;判断当前节点地址与第一任务地址是否相同;如果当前节点地址与第一任务地址相同,则将第一定时任务推送至任务执行队列,以生成待执行任务;如果当前节点地址与第一任务地址不同,则将第一定时任务存储于第一任务地址对应的第一任务节点。
10.可选的,将第一定时任务存储于任务地址对应的第一任务节点,包括:获取第一定
时任务的写入锁;通过写入锁将第一定时任务存储在第一任务节点;响应于第一定时任务的存储操作的执行结束指令,释放写入锁。
11.可选的,将第一定时任务存储于第一任务地址对应的第一任务节点,包括:获取时间精度,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数;将第一定时任务和第一轮询次数存储于第一任务节点;其中,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数,包括:对第一延时参数和时间精度进行整除运算以确定第一任务地址;对第一延时参数和时间精度进行取余运算以确定第一轮询次数。
12.可选的,上述方法还包括:确定与第一定时任务具有相同任务地址的第二定时任务,并确定第二定时任务的第二轮询次数;根据第二定时任务与第二轮询次数构建任务集合;将第一任务节点的前驱结点的地址确定为第一节点地址,将第一任务节点的后继结点的地址确定为第二节点地址;将第一节点地址、第二节点地址以及任务集合存储于第一任务节点。
13.可选的,执行待执行任务,包括:获取待执行任务的消费锁,通过消费锁从任务执行队列中获取待执行任务;执行待执行任务并获取执行结果,判断执行结果是否为执行成功;如果执行结果为执行成功,则释放消费锁。
14.可选的,上述方法还包括:如果执行结果为执行失败,则将待执行任务推送至任务执行队列,并获取待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列。
15.根据本公开的第二方面,提供一种定时任务处理装置,包括:哈希表获取模块,用于获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中;任务获取模块,用于确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表;判断模块,用于解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态;任务执行模块,用于如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。
16.可选的,定时任务处理装置还包括第一任务存储模块,用于获取第一定时任务的第一延时参数,根据第一延时参数确定第一定时任务在任务哈希表中的第一任务地址;将目标指针当前遍历的节点地址作为当前节点地址;判断当前节点地址与第一任务地址是否相同;如果当前节点地址与第一任务地址相同,则将第一定时任务推送至任务执行队列,以生成待执行任务;如果当前节点地址与第一任务地址不同,则将第一定时任务存储于第一任务地址对应的第一任务节点。
17.可选的,第一任务存储模块包括第一任务存储单元,用于获取第一定时任务的写入锁;通过写入锁将第一定时任务存储在第一任务节点;响应于第一定时任务的存储操作的执行结束指令,释放写入锁。
18.可选的,第一任务存储模块包括第二任务存储单元,用于获取时间精度,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数;将第一定时任务和第一轮询次数存储于第一任务节点;其中,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数,包括:对第一延时参数和时间精度进行整除运算以
确定第一任务地址;对第一延时参数和时间精度进行取余运算以确定第一轮询次数。
19.可选的,定时任务处理装置还包括第二任务存储模块,用于确定与第一定时任务具有相同任务地址的第二定时任务,并确定第二定时任务的第二轮询次数;根据第二定时任务与第二轮询次数构建任务集合;将第一任务节点的前驱结点的地址确定为第一节点地址,将第一任务节点的后继结点的地址确定为第二节点地址;将第一节点地址、第二节点地址以及任务集合存储于第一任务节点。
20.可选的,任务执行模块包括任务执行单元,用于获取待执行任务的消费锁,通过消费锁从任务执行队列中获取待执行任务;执行待执行任务并获取执行结果,判断执行结果是否为执行成功;如果执行结果为执行成功,则释放消费锁。
21.可选的,定时任务处理装置还包括任务分类模块,用于如果执行结果为执行失败,则将待执行任务推送至任务执行队列,并获取待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列。
22.根据本公开的第三方面,提供一种定时任务处理系统,包括:任务发布装置,用于根据定时任务的延时参数和预配置的时间精度确定定时任务在任务哈希表中的任务地址,并将定时任务存储在任务地址对应的任务节点中;其中,任务哈希表包括多个任务节点;哈希表轮询装置,用于轮询任务哈希表中的任务节点,并将任务节点中的待执行任务推送至任务执行队列;任务处理装置,用于从任务执行队列中获取并执行待执行任务,根据待执行任务的执行结果确定待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列;失败任务管理装置,用于存储执行失败任务,以恢复执行失败任务。
23.根据本公开的第四方面,提供一种电子设备,包括:处理器;以及存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现根据上述任意一项所述的定时任务处理方法。
24.根据本公开的第五方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现根据上述任意一项所述的定时任务处理方法。
25.本公开提供的技术方案可以包括以下有益效果:
26.本公开的示例性实施例中的定时任务处理方法,获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中;确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表;解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态;如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。通过本公开的定时任务处理方法,一方面,根据定时任务的延时参数和预配置时间精度可以将定时任务散列分布存储在任务哈希表中,可以满足多种类任务的调度要求,应用范围广,灵活性高。另一方面,通过目标指针轮询任务哈希表,使得动态监控任务哈希表中的定时任务的执行频率具有较高的灵活性,并且任务哈希表的存储结构简单,不存在外键依赖,可以提供一种轻量级的定时任务管理。又一方面,将目标任务推送至任务执行队列进行存储,可以持久化待执行任务的任务数据。
27.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
28.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
29.图1示意性示出了根据本公开的示例性实施方式的定时任务处理方法的流程图;
30.图2示意性示出了根据本公开的示例性实施方式的任务哈希表的数据结构图;
31.图3示意性示出了根据本公开的示例性实施方式的对定时任务进行发布处理的流程图;
32.图4示意性示出了根据本公开的示例性实施方式的轮询任务哈希表的流程图;
33.图5示意性示出了根据本公开的示例性实施方式的执行待执行任务的流程图;
34.图6示意性示出了根据本公开的示例性实施方式的定时任务处理装置的方框图;
35.图7示意性示出了根据本公开的示例性实施方式的定时任务处理系统的方框图;
36.图8示意性示出了根据本公开一示例性实施例的电子设备的框图;
37.图9示意性示出了根据本公开一示例性实施例的计算机可读存储介质的示意图。
具体实施方式
38.现在将参考附图更全面地描述示例实施例。然而,示例实施例能够以多种形式实施,且不应被理解为限于在此阐述的实施例;相反,提供这些实施例使得本公开将全面和完整,并将示例实施例的构思全面地传达给本领域的技术人员。在图中相同的附图标记表示相同或类似的部分,因而将省略对它们的重复描述。
39.此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本公开的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本公开的技术方案而没有所述特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知结构、方法、装置、实现、材料或者操作以避免模糊本公开的各方面。
40.附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个软件硬化的模块中实现这些功能实体或功能实体的一部分,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
41.在由多个业务模块组成的业务系统中,各个业务模块通常被封装拆分成一个个独立部署的应用,独立维护。如果每个模块中都实现各自的定时管理,常常会导致任务无法集中管理,导致定时功能与业务逻辑耦合在一起,因此,定时任务管理中心要做的是统一管理这些散落在各个业务模块中的定时任务。现有的定时管理任务技术实现方式通常包括:java自带的功能类、现有的开源quartz框架、spring自己实现的定时任务管理。
42.在采用java的定时器(timer)类实现时,timer允许调度一个
java.util.timertask任务,使用这种方式可以让业务模块中的程序按照某一个频度执行。但timer类实现方式存在以下不足:(1)执行任务的线程只有一个,所以如果某个任务的执行时间过长,那么将破坏其他任务的定时精确性;(2)如果执行某个任务过程中抛出了异常,那么执行线程将会终止,导致其他任务也不能再执行;(3)timer类使用的是绝对时间,它执行依赖系统的时间,如果系统时间被修改,将导致任务可能不被执行,而且任务不能在指定时间运行,灵活性较差。
43.java语言的软件开发工具包(jdk)自带的定期执行服务类(scheduledexecutorservice)是基于线程池设计的定时任务类,这种基于内存实现的定时方法,没有持久化任务,如果程序重启或者宕机,将无法恢复正在执行任务。
44.quartz定时器实现方式,采用该技术实现的系统侵入性较大,表结构需要使用quartz底层设计,有外键依赖,风险较大,使用成本高。
45.spring自带的任务调度实现,删除和修改任务比较复杂,并且该方法无法动态修改任务的执行频率,如果需要修改只能重启服务。
46.基于此,在本示例实施例中,首先提供了一种定时任务处理方法,可以利用服务器来实现本公开的用定时任务处理方法,也可以利用终端设备来实现本公开所述的方法,其中,本公开中描述的终端可以包括诸如手机、平板电脑、笔记本电脑、掌上电脑、个人数字助理(personal digital assistant,pda)等移动终端,以及诸如台式计算机等固定终端。图1示意性示出了根据本公开的一些实施例的定时任务处理方法流程的示意图。参考图1,该定时任务处理方法可以包括以下步骤:
47.步骤s110,获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中。
48.步骤s120,确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表。
49.步骤s130,解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态。
50.步骤s140,如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。
51.根据本示例实施例中的定时任务处理方法,一方面,根据定时任务的延时参数和预配置时间精度可以将定时任务散列分布存储在任务哈希表中,可以满足多种类任务的调度要求,应用范围广,灵活性高。另一方面,通过目标指针轮询任务哈希表,使得动态监控任务哈希表中的定时任务的执行频率具有较高的灵活性,并且任务哈希表的存储结构简单,不存在外键依赖,可以提供一种轻量级的定时任务管理。又一方面,将目标任务推送至任务执行队列进行存储,可以持久化待执行任务的任务数据。
52.下面,将对本示例实施例中的定时任务处理方法进行进一步的说明。
53.在步骤s110中,获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中。
54.在本公开的一些示例性实施方式中,定时任务可以是预先配置的需要在未来某个时间点执行的系统任务,定时任务可以是已经过任务发布处理并存储在任务哈希表中的任务。定时任务可以是周期性的定时任务,也可以是一次性的定时任务。例如,定时任务可以
包括预先设置的定时关机对应的任务,备忘录提醒任务,定时重置数据任务等。任务哈希表可以是存储定时任务的哈希表,任务哈希表的任务节点中存储了需要执行的定时任务。延时参数可以表示当前时刻距离定时任务的触发时间点的时长参数,例如,某一闹钟定时任务需要在三分钟后触发,则该定时任务的延时参数为3分钟。时间精度可以是根据定时任务的触发时间定义的时间精度,例如,可以将定时任务的时间精度设置为“秒”级,在其他示例性实施例中,可以根据定时任务延时参数的相关特征确定时间精度,例如,时间精度可以确定为“分”、“微秒”、“毫秒”等级别,本公开对时间精度的精度级别不作任何特殊限定。任务节点可以是任务哈希表中用于存储定时任务的节点。
55.在实现定时任务的管理过程中,可以获取用于存储定时任务的任务哈希表,对于每一个定时任务,均可以根据自身的延时参数和预先配置的时间精度进行哈希计算后,确定出该定时任务存储在任务哈希表中的具体任务节点,并将定时任务存储在任务节点中,以便后续触发执行该定时任务。
56.参考图2,图2示意性示出了根据本公开的示例性实施方式的任务哈希表的数据结构图。在本公开的一些示例性实施例中,可以将时间精度设置为“秒”级,因此任务哈希表的长度可以为60,即任务哈希表由60个任务节点组成,如任务节点210(节点1)、任务节点220(节点2)、任务节点230(节点3),直至任务节点240(节点60)。任务哈希表可以采用双链表结构,即任务哈希表中的任务节点之间形成一个环,以便目标指针进行任务哈希表的轮询操作。
57.根据本公开的一些示例性实施例,获取第一定时任务的第一延时参数,根据第一延时参数确定第一定时任务在任务哈希表中的第一任务地址;将目标指针当前遍历的节点地址作为当前节点地址;判断当前节点地址与第一任务地址是否相同;如果当前节点地址与第一任务地址相同,则将第一定时任务推送至任务执行队列,以生成待执行任务;如果当前节点地址与第一任务地址不同,则将第一定时任务存储于第一任务地址对应的第一任务节点。第一定时任务可以是系统中待发布的定时任务。第一定时任务的数量可以为多个,且可以是多种不同类型的定时任务。第一任务地址可以是第一定时任务所在的任务哈希表中的任务节点的地址。目标指针可以是预先定义的用于轮询任务哈希表的指针。当前节点地址可以是目标指针当前指向的任务节点的地址。任务执行队列可以是用于存储待执行任务的队列,任务执行队列可以通过能够提供持久化数据服务的数据库实现,例如,任务执行队列可以采用远程字典服务(remote dictionary server,redis)数据库实现。待执行任务可以满足执行触发条件的定时任务。
58.参考图3,图3示意性示出了根据本公开的示例性实施方式的对定时任务进行发布处理的流程图。本公开将以第一定时任务的处理过程为例,对定时任务的发布处理过程进行说明。对于第一定时任务,可以确定出第一定时任务在任务哈希表中的第一任务地址,具体的,在步骤s301中,可以获取第一定时任务的第一延时参数,根据第一延时参数和预先设定的计算规则,根据该计算规则对第一延时参数进行运算,确定出第一定时任务在任务哈希表中的第一任务地址。在步骤s302中,可以获取目标指针在遍历任务哈希表的过程中,当前指向的节点地址,并将该节点地址作为当前节点地址。在步骤s303中,在获取到当前节点地址后,可以判断当前节点地址与计算出的第一任务地址是否相同。在步骤s304中,如果当前节点地址和第一任务地址相同,则说明该定时任务已经到达执行触发时间,即第一定时
任务可以触发执行,因此,可以将第一定时任务推送至任务执行队列中,以便执行第一定时任务。在步骤s305中,如果当前节点地址与第一任务地址不同,则将第一定时任务存储至任务哈希表中的第一任务节点中,第一定时任务对应的第一任务节点可以是与计算出的与第一任务地址对应的第一任务节点。
59.根据本公开的另一示例性实施例,获取第一定时任务的写入锁;通过写入锁将第一定时任务存储在第一任务节点;响应于第一定时任务的存储操作的执行结束指令,释放写入锁。写入锁可以是用于确保写者对资源进行写操作时所采用的机制。在本公开中,可以采用多个线程来实现将定时任务存储在任务哈希表,而对于每个定时任务,一次只有一个线程可以获取该定时任务的写入锁,以实现多线程的处理。执行结束指令可以是完成将定时任务存储至任务哈希表的操作后所触发的指令。
60.将第一定时任务存储至任务节点的具体过程如下,参考图3,在步骤s306中,在将第一定时任务存储在任务哈希表中的第一任务节点前,可以通过操作线程获取第一定时任务的写入锁。在步骤s307中,可以判断操作线程是否获取到第一定时任务的写入锁,在步骤s308中,如果操作线程未获取到第一定时任务的写入锁,则返回。在步骤s309中,当判断该操作线程获取到第一定时任务的写入锁时,可以执行将第一定时任务存储于任务哈希表中与第一任务地址对应的第一任务节点中,当第一定时任务的存储操作完成后,可以生成存储操作的执行结束指令,响应于执行结束指令,可以释放第一定时任务的写入锁。
61.根据本公开的又一示例性实施例,获取时间精度,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数;将第一定时任务和第一轮询次数存储于第一任务节点;其中,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数,包括:对第一延时参数和时间精度进行整除运算以确定第一任务地址;对第一延时参数和时间精度进行取余运算以确定第一轮询次数。第一轮询次数可以是第一定时任务在触发执行之前,从任务哈希表中取出并判断是否触发执行的次数。
62.获取到预先配置的时间精度后,可以根据第一定时任务的第一延时参数和时间精度确定第一定时任务在任务哈希表中的第一任务地址以及第一轮询次数。在本公开中,任务哈希表的表结构可以是一个定长的数组结构,例如,可以将时间精度预先配置为秒级,则每个哈希数组的时间精度可以确定为1秒,任务哈希表的数组长度可以为60,即1分钟。因此,任务哈希表可以由60个任务节点组成。在获取到第一定时任务的第一延时参数后,可以根据将第一延时参数与时间精度进行运算,确定出第一定时任务对应的第一任务地址和第一轮询次数。举例而言,可以将第一定时任务的第一延时参数转化为秒级,第一延时参数可以用time表示,任务地址用b表示,轮询次数可以用n表示。对第一延时参数和时间精度进行整除运算可以确定出第一定时任务的第一任务地址,第一任务地址的计算公式是time/60=n;对第一延时参数和时间精度进行取余运算可以确定出第一定时任务的第一轮询次数,第一轮询次数的计算公式可以是time%60=b。确定出第一定时任务的任务地址后,可以将第一定时任务以及计算出的第一定时任务的第一轮询次数存储在与第一任务地址对应的第一任务节点中。
63.在本公开中,可以将根据第一定时任务的第一延时参数和时间精度确定其在任务哈希表中的任务地址,并将其存储在任务哈希表中的第一任务地址对应的第一任务节点的过程称之为任务发布过程,在任务发布过程中,可以同时启动多个操作线程进行,同时确定
不同定时任务的任务地址,并将定时任务存储在任务地址对应的任务节点中,在本公开的示例性实施例中,可以根据定时任务数量的多少调整任务发布管理的线程数,以便及时地将定时任务存储至任务哈希表中。
64.根据本公开的再一示例性实施例,确定与第一定时任务具有相同任务地址的第二定时任务,并确定第二定时任务的第二轮询次数;根据第二定时任务与第二轮询次数构建任务集合;将第一任务节点的前驱结点的地址确定为第一节点地址,将第一任务节点的后继结点的地址确定为第二节点地址;将第一节点地址、第二节点地址以及任务集合存储于第一任务节点。第二定时任务可以是与第一定时任务具有相同任务地址的其他定时任务,即第二定时任务与第一定时任务存储在任务哈希表的第一任务节点中。第二定时任务同样是待发布的定时任务。第二定时任务对应的任务地址可以称为第二任务地址。第二轮询次数可以是第二定时任务对应的轮询次数。任务集合可以是由第一定时任务和第二定时任务共同组成的集合,任务集合中存储了第一定时任务和第二定时任务以及各任务的任务信息,如第二轮询次数和第二任务地址。第一节点地址可以是第一定时任务所处第一任务节点的前驱结点(前一个节点)的地址。第二节点地址可以是第一定时任务所处第一任务节点的后继结点(后一个节点)的地址。
65.由于定时任务的数量可以为多个,各定时任务的任务地址可以不同。确定每个定时任务在任务哈希表中对应的任务地址的过程如下,以第一定时任务(定时任务a)为例,可以将与定时任务a具有相同任务地址的其他定时任务确定为第二定时任务,第二定时任务与定时任务a具有相同的任务地址。获取到这些第二定时任务的延时参数后,可以计算出各个第二定时任务的第二轮询次数,将第二轮询次数作为第二定时任务的任务信息与第二定时任务一同存储,可以形成任务集合,任务集合中可以存储具有不同轮询次数的定时任务,并且这些具有不同轮询次数和同一任务地址的多个定时任务组成的任务集合可以存储在同一个任务节点中。参考图2,图2中的定时任务211、定时任务212和定时任务213可以组成任务节点1中存储的任务集合,可以将任务集合均存储在任务节点1中。由于第二定时任务与定时任务a具有相同的任务地址,因此可以将任务集合存储在定时任务a所处的任务哈希表的任务节点中。为了实现任务哈希表的轮询,任务哈希表可以采用双链表结构,任务哈希表的每一个任务节点均存储有该任务节点对应的前驱任务节点的地址和后继任务节点的地址。例如,任务节点2中可以存储任务节点1和任务节点3分别对应的任务地址。任务哈希表采用双链表结构可以提高对任务哈希表中任务节点的删除速度,支持实现循环轮询。通过上述任务发布方式,可以将定时任务分布存储与任务哈希表对应的任务节点中,以便通过轮询任务哈希表对任务哈希表中的定时任务进行处理。
66.在步骤s120中,确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表。
67.在本公开的一些示例性实施方式中,节点地址可以是目标指针在轮询任务哈希表的过程中,当前指向的任务节点的地址。目标任务可以是根据节点地址从节点地址对应的任务节点中获取到的定时任务。
68.参考图4,图4示意性示出了根据本公开的示例性实施方式的轮询任务哈希表的流程图。在步骤s401中,在获取到任务哈希表后,可以确定出目标指针在任务哈希表中当前指向的任务节点的节点地址,即目标指针在哈希任务表中的当前所在位置,根据节点地址从
该任务节点中获取目标任务,以对目标任务进行处理。具体的,根据节点地址从该任务节点中获取目标任务的具体过程可以是,由于本公开中存在多个线程进行定时任务的读写操作,为了保证多线程的正确运行,因此,在步骤s402中,在获取目标任务之前,可以先由操作线程获取该任务节点的读锁,在步骤s403中,可以判断操作线程是否获取到读锁,在步骤s404中,如果操作线程未获取到读取该任务节点的读锁时,则结束当前操作。在步骤s405中,当判断操作线程获取到读取该任务节点的读锁时,则可以从任务节点中获取到目标任务,获取到目标任务后,释放读锁,以便其他操作线程在后续过程中可以再次从该任务节点中获取定时任务。
69.在通过目标指针轮询任务哈希表的过程中,本公开可以仅启动一个操作线程进行任务哈希表的轮询操作,而无需多个操作线程对定时任务进行实时监控,可以大大减少线程资源的浪费。
70.在步骤s130中,解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态。
71.在本公开的一些示例性实施方式中,解析目标任务可以是对目标任务的解析操作。解析结果可以是对目标任务进行解析操作后得到的结果。待执行状态可以是目标任务的一个对应状态,当目标任务处于待执行状态时,表示目标任务可以被触发执行。参考图4,在步骤s406中,当获取到目标任务后,可以解析目标任务并获取目标任务的解析结果,在步骤s407中,根据解析结果确定目标任务的任务状态,判断目标任务是否处于待执行状态,并触发执行目标任务。
72.具体的,对目标任务的解析过程为:判断目标任务的轮询次数的值是否为0,如果目标任务的轮询次数的值为0,则可以认为目标任务处于待执行状态。如果目标任务的轮询次数的值不为0,则认为目标任务还未到达触发执行时间,暂时不执行该目标任务。
73.在步骤s140中,如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。
74.在本公开的一些示例性实施方式中,任务执行队列可以是用于存储待执行任务的队列,任务执行队列可以基于redis数据库技术实现。待执行任务可以是已经到达触发执行时间,可以被触发执行的目标任务,即处于待执行状态的目标任务。参考图4,在步骤s408中,如果目标任务处于待执行状态,则可以将目标任务推送至任务执行队列,目标任务推送至任务执行队列,将生成相应的待执行任务,并执行任务执行队列中的待执行任务。在步骤s409中,如果目标任务未处于待执行状态,即不触发执行目标任务,则将目标任务的轮询次数减1,即n-1,更新目标任务的轮询次数,并将更新后的目标任务重新放入到任务节点中,以等待下次轮询。通过步骤s401~步骤s409中的任务处理过程,可以对轮询任务哈希表时从任务节点中获取到的目标任务进行处理。在步骤s410中,对该目标任务处理结束后,目标指针将移动至任务哈希表中的下一个节点,继续进行哈希任务表的轮询操作。
75.根据本公开的一些示例性实施例,获取待执行任务的消费锁,通过消费锁从任务执行队列中获取待执行任务;执行待执行任务并获取执行结果,判断执行结果是否为执行成功;如果执行结果为执行成功,则释放消费锁。消费锁可以是用于在多线程环境中,为了避免对待执行任务造成重复执行所采用的机制。执行结果可以是触发执行待执行任务,待执行任务执行结束后确定出的结果。释放消费锁可以是操作线程将抢占到的触发执行待执
行任务的消费锁释放的操作,操作线程释放消费锁可以使其他操作线程后续继续抢占消费锁,以执行待执行任务。
76.参考图5,图5示意性示出了根据本公开的示例性实施方式的执行待执行任务的流程图。在步骤s501中,获取用于触发执行待执行任务的消费锁,在步骤s502中,可以判断操作线程是否获取到消费锁,在步骤s503中,如果操作线程未获取到消费锁,则停止当前操作,并返回。在步骤s504中,如果操作线程获取到消费锁,则可以从任务执行队列中获取到待执行任务,在步骤s505中,执行待执行任务或获取待执行任务的执行结果。在步骤s506中,判断该待执行任务是否执行成功,在步骤s507中,如果待执行任务的执行结果为执行成功,则操作线程可以释放消费锁,并返回,以便其他操作线程通过消费锁执行任务执行队列中的其他待执行任务。
77.根据本公开的一些示例性实施例,如果执行结果为执行失败,则将待执行任务推送至任务执行队列,并获取待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列。执行失败次数可以是待执行任务未成功执行的次数。待执行任务的执行结果为执行失败,则将待执行任务的执行失败次数自动加1。重试次数阈值可以是预先配置的用于统计待执行任务的重新执行次数的阈值。执行失败任务可以是执行失败次数大于重试次数阈值的待执行任务。失败任务队列可以是用于存储执行失败任务的队列,失败任务队列可以基于redis数据库实现,以实现持久化数据的目的。
78.参考图5,在步骤s508中,如果待执行任务的执行结果为执行失败,则可以将待执行任务推送至任务执行队列,并获取该待执行任务的执行失败次数,执行失败次数可以在每次任务执行结束后更新。在步骤s509中,将获取到的执行失败次数与重试次数阈值进行对比,判断执行失败次数是否到达重试次数阈值的上限。在步骤s510中,如果执行失败次数大于重试次数阈值,则可以将待执行任务确定为执行失败任务,并将其推送至失败任务队列,以通过失败任务队列对执行失败任务进行管理,等待恢复执行失败任务。
79.需要说明的是,本公开所使用的术语“第一”、“第二”等,仅是为了区分不同的定时任务,不同定时任务对应的延时参数、任务节点、任务地址和轮询次数,不同的节点地址,并不应对本公开造成任何限制。
80.综上所述,获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中;确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表;解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态;如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。通过本公开的定时任务处理方法,一方面,根据延时参数和时间精度可以将定时任务散列分布存储在任务哈希表的节点中,可以满足多种类任务的调度要求,应用范围广,灵活性高。另一方面,通过目标指针轮询任务哈希表,使得动态监控任务哈希表中的定时任务的执行频率具有较高的灵活性,并且任务哈希表的存储结构简单,不存在外键依赖,可以提供一种轻量级的定时任务管理。又一方面,将目标任务推送至任务执行队列进行存储,可以持久化待执行任务的任务数据。再一方面,通过失败任务队列对执行失败任务进行存储管理,可以持久化未执行的执行失败任务,防止由于程序重启或宕机等
原因导致无法恢复定时任务。
81.需要说明的是,尽管在附图中以特定顺序描述了本发明中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
82.此外,在本示例实施例中,还提供了一种定时任务处理装置。参考图6,该定时任务处理装置600可以包括:哈希表获取模块610、任务获取模块620、判断模块630以及任务执行模块640。
83.具体的,哈希表获取模块610可以用于获取包括多个定时任务的任务哈希表;其中,定时任务根据定时任务的延时参数和预配置的时间精度存储于任务哈希表的任务节点中;任务获取模块620可以用于确定目标指针当前指向的任务节点的节点地址,获取与节点地址对应的任务节点中的目标任务;其中,目标指针用于轮询任务哈希表;判断模块630可以用于解析目标任务并获取解析结果,根据解析结果判断目标任务是否处于待执行状态;任务执行模块640可以用于如果目标任务处于待执行状态,则将目标任务推送至任务执行队列以生成待执行任务,并执行待执行任务。
84.定时任务处理装置600根据定时任务的延时参数和预配置时间精度将定时任务散列分布存储在任务哈希表中,可以满足多种类任务的调度要求,应用范围广,灵活性高,并且任务哈希表的存储结构简单,不存在外键依赖,可以提供一种轻量级的定时任务管理;通过目标指针轮询任务哈希表中任务节点,可以动态监控任务哈希表中的定时任务,使得定时任务的执行频率具有较高的灵活性;通过任务执行队列存储定时任务推送至,可以持久化定时任务的任务数据。可以实现高性能、高灵活性、低复杂度并且可以持久化的任务定时处理,是一种行之有效的定时任务处理装置。
85.在本公开的一种示例性实施方案中,定时任务处理装置还包括第一任务存储模块,用于获取第一定时任务的第一延时参数,根据第一延时参数确定第一定时任务在任务哈希表中的第一任务地址;将目标指针当前遍历的节点地址作为当前节点地址;判断当前节点地址与第一任务地址是否相同;如果当前节点地址与第一任务地址相同,则将第一定时任务推送至任务执行队列,以生成待执行任务;如果当前节点地址与第一任务地址不同,则将第一定时任务存储于第一任务地址对应的第一任务节点。
86.在本公开的一种示例性实施方案中,第一任务存储模块包括第一任务存储单元,用于获取第一定时任务的写入锁;通过写入锁将第一定时任务存储在第一任务节点;响应于第一定时任务的存储操作的执行结束指令,释放写入锁。
87.在本公开的一种示例性实施方案中,第一任务存储模块包括第二任务存储单元,用于获取时间精度,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数;将第一定时任务和第一轮询次数存储于第一任务节点;其中,根据第一延时参数和时间精度确定第一定时任务的第一任务地址和第一轮询次数,包括:对第一延时参数和时间精度进行整除运算以确定第一任务地址;对第一延时参数和时间精度进行取余运算以确定第一轮询次数。
88.在本公开的一种示例性实施方案中,定时任务处理装置还包括第二任务存储模块,用于确定与第一定时任务具有相同任务地址的第二定时任务,并确定第二定时任务的
第二轮询次数;根据第二定时任务与第二轮询次数构建任务集合;将第一任务节点的前驱结点的地址确定为第一节点地址,将第一任务节点的后继结点的地址确定为第二节点地址;将第一节点地址、第二节点地址以及任务集合存储于第一任务节点。
89.在本公开的一种示例性实施方案中,任务执行模块包括任务执行单元,用于获取待执行任务的消费锁,通过消费锁从任务执行队列中获取待执行任务;执行待执行任务并获取执行结果,判断执行结果是否为执行成功;如果执行结果为执行成功,则释放消费锁。
90.在本公开的一种示例性实施方案中,定时任务处理装置还包括任务分类模块,用于如果执行结果为执行失败,则将待执行任务推送至任务执行队列,并获取待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列。
91.上述中各定时任务处理装置的虚拟模块的具体细节已经在对应的定时任务处理方法中进行了详细的描述,因此此处不再赘述。
92.应当注意,尽管在上文详细描述中提及了定时任务处理装置的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
93.进一步地,在另一示例实施例中,还提供了一种定时任务处理系统。参考图7,该定时任务处理系统700可以包括:任务发布装置710、哈希表轮询装置720、任务处理装置730以及失败任务管理装置740。
94.具体的,任务发布装置710可以用于根据定时任务的延时参数和预配置的时间精度确定定时任务在任务哈希表中的任务地址,并将定时任务存储在任务地址对应的任务节点中;其中,任务哈希表包括多个任务节点;哈希表轮询装置720可以用于轮询任务哈希表中的任务节点,并将任务节点中的待执行任务推送至任务执行队列;任务处理装置730可以用于从任务执行队列中获取并执行待执行任务,根据待执行任务的执行结果确定待执行任务的执行失败次数;如果执行失败次数大于重试次数阈值,则将待执行任务确定为执行失败任务,并将执行失败任务推送至失败任务队列;失败任务管理装置740可以用于存储执行失败任务,以恢复执行失败任务。
95.定时任务处理系统700通过任务发布装置可根据任务发布队列701中的定时任务的延时参数确定定时任务在任务哈希表中的任务地址,将定时任务存储至任务哈希表中;通过哈希表轮询装置可以轮询任务哈希表中的任务节点,并获取到任务节点中的定时任务,并将定时任务推送中任务执行队列702中,任务处理装置对定时任务处理完成后,可以判断该定时任务是否为执行失败任务,如果是执行失败任务,则将失败任务推送至失败任务队列,以便失败任务管理装置对执行失败任务进行管理。
96.此外,在本公开的示例性实施例中,还提供了一种能够实现上述方法的电子设备。
97.所属技术领域的技术人员能够理解,本发明的各个方面可以实现为系统、方法或程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施例、完全的软件实施例(包括固件、微代码等),或硬件和软件方面结合的实施例,这里可以统称为“电路”、“模块”或“系统”。
98.下面参考图8来描述根据本发明的这种实施例的电子设备800。图8显示的电子设
备800仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
99.如图8所示,电子设备800以通用计算设备的形式表现。电子设备800的组件可以包括但不限于:上述至少一个处理单元810、上述至少一个存储单元820、连接不同系统组件(包括存储单元820和处理单元810)的总线830、显示单元840。
100.其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元810执行,使得所述处理单元810执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施例的步骤。
101.存储单元820可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(ram)821和/或高速缓存存储单元822,还可以进一步包括只读存储单元(rom)823。
102.存储单元820可以包括具有一组(至少一个)程序模块825的程序/实用工具824,这样的程序模块825包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
103.总线830可以表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、外围总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
104.电子设备800也可以与一个或多个外部设备870(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备800交互的设备通信,和/或与使得该电子设备800能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(i/o)接口850进行。并且,电子设备800还可以通过网络适配器860与一个或者多个网络(例如局域网(lan),广域网(wan)和/或公共网络,例如因特网)通信。如图所示,网络适配器860通过总线830与电子设备800的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备800使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、raid系统、磁带驱动器以及数据备份存储系统等。
105.通过以上的实施例的描述,本领域的技术人员易于理解,这里描述的示例实施例可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本公开实施例的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本公开实施例的方法。
106.在本公开的示例性实施例中,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施例中,本发明的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述“示例性方法”部分中描述的根据本发明各种示例性实施例的步骤。
107.参考图9所示,描述了根据本发明的实施例的用于实现上述方法的程序产品900,其可以采用便携式紧凑盘只读存储器(cd-rom)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本发明的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
108.所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
109.计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
110.可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、rf等等,或者上述的任意合适的组合。
111.可以以一种或多种程序设计语言的任意组合来编写用于执行本发明操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、c 等,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
112.此外,上述附图仅是根据本发明示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
113.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其他实施例。本技术旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由权利要求指出。
114.应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献