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

一种处理延时任务的方法及装置与流程

2022-04-09 05:39:31 来源:中国专利 TAG:


1.本发明涉及任务处理技术领域,具体提供一种处理延时任务的方法及装置。


背景技术:

2.随着互联网技术的发展,在基于互联网的多个业务领域中,因为履约流程较复杂且履约周期较长,延时任务的应用场景越来越多。例如,订单提交之后,若超过指定支付时间未支付成功,则需要取消该订单,再例如,订单完成之后,若超过指定评价时间为及时评价,则为该订单设置默认的评价信息。又列如,优惠券等虚拟网络资源在被激活以后,若超过指定使用时间未被使用,则自动作废。
3.目前还针对此类业务需求,在一些实施方式中,会在接收到延时任务之后,将延时任务触发逻辑信息存储与数据库,同时,通过定时任务按照一定周期去扫描该数据库,以检测是否存在需要执行的延时任务,若存在需要执行的延时任务,则从数据库中一次性取出延时任务然后批量执行。但是,基于定时任务扫描数据库的实现方案中,定时任务按照一定周期执行,则延时任务执行时间会相对滞后,造成延时任务执行时间不准确问题,而且每次都要进行全表扫描,执行效率低下,并且在未扫描到延时任务的周期内,cpu处于空转状态,造成资源浪费。


技术实现要素:

4.本发明是针对上述现有技术的不足,提供一种实用性强的处理延时任务的方法。
5.本发明进一步的技术任务是提供一种设计合理,安全适用的延时任务实现装置。
6.本发明解决其技术问题所采用的技术方案是:
7.一种处理延时任务的方法,采用多层的时间轮,一层时间轮底层数据结构为一个环形数组,数组中每个位置代表时间轮中的一个槽,所述槽用于存放延时任务;
8.所述时间轮还包括一个时间指针,时间指针指向时间轮中的槽,随着时间推移,时间指针按照一定时间周期沿着时间轮不断移动,当时间指针指向某个槽时,说明该槽内延时任务已过期,需要取出延时任务执行;
9.所述多层时间轮呈钟表式分布,内层时间轮转动一周,外层时间轮转动一格,所述时间轮依次向外扩展,进而增大时间轮跨度。
10.进一步的,所述时间轮槽对象为bucket,内部维护过期时间属性和双向链表tasklist,双向链表tasklist用于存放延时任务,过期时间属性初始值为-1。
11.进一步的,所述时间轮的时间粒度使用tickms表示,代表时间轮转动一格槽需要经过的时间,所述时间轮的大小使用wheelsize表示,即单层时间轮的环形数组长度;
12.wheelsize设置为2的指数幂,若延时任务过期时间为expiredtime,则延时任务所处时间轮中槽的下标计算公式如下:
13.index=(exp iredtime/tickms)&(wheelsize-1)
ꢀꢀꢀ
(1)
14.其中,index为延时任务所处时间轮中槽的下标。
15.int erval:时间轮跨度,计算方式如下:
16.int erval=tickms
×
wheelsize
ꢀꢀꢀ
(2)
17.进一步的,当前所述时间轮的时间指针使用currenttime表示,结合时间轮跨度参数interval判断当前时间轮是否可以存放某个延时任务,若延时任务过期时间为exp iredtime,则exp iredtime必须同时满足以两个条件,才可存放于时间轮中,
18.exp iredtime≥currenttime tickms
ꢀꢀꢀ
(3)
19.exp iredtime≤currenttime int erval
ꢀꢀꢀ
(4)
20.不满足公式(3)则说明延时任务已过期,需要执行此延时任务;不满足公式(4)说明当前时间轮无法容纳此延时任务,此时继续尝试在外层时间轮存放该延时任务;
21.指向外层时间轮的指针使用timewheel,其中,delayqueue指java中原生延时队列,用于存放时间轮槽对象bucket。
22.进一步的,所述时间轮初始化指定tickms、wheelsize和currenttime,其中currenttime为初始化时间轮时的当前时间;在时间轮内部初始化一个延时队列delayqueue,多层时间轮共用同一个delayqueue,同时开启一个后台线程,不断的从延时队列中获取bucket,当获取到bucket时,遍历其存放任务进行处理;
23.当delayqueue中队首bucket未过期或者delayqueue为空时,后台线程进入睡眠状态。
24.进一步的,在所述时间轮添加任务,主要步骤如下:
25.s1、根据公式(4)判断当前时间轮是否可以容纳延时任务;
26.s2、计算出bucket过期时间;
27.s3、根据公式(3)判断任务是否已经过期。
28.进一步的,在步骤s1中,若可以容纳所述延时任务,根据公式(1)计算延时任务所处时间轮槽下标,根据下标获取槽bucket,然后在该bucket中双向链表tasklist中尾部添加任务;
29.在步骤s2中,判断bucket当前的过期时间是否与计算出过期时间一致,如果一致,则执行步骤s3,否则更新bucket过期时间,然后将bucket添加到delayqueue中;如果一致,则说明bucket已在delayqueue中;
30.exp iredtime
bucket
=exp iredtime
task-exp iredtime
task
%tickms
ꢀꢀꢀ
(5)
31.在步骤s3中,如果已经过期,则将延时任务放入异步线程池执行任务;如果未过期,当前时间轮存在外层时间轮,则继续向外层时间轮添加任务;若不存在,则以内层时间轮指针作为外层时间轮指针构造外层时间轮,然后继续向外层时间轮添加任务。
32.进一步的,在时间轮获取任务时,初始化时间轮开启后台线程,不断地从delayqueue中获取bucket,队首中最先过期的bucket会首先从队列中弹出,设得到bucket的过期时间expiredtime,根据公式(3)判断时间轮当前能表示的最小过期时间是不是比bucket过期时间小,如果是,按照如下公式(6)更新时间轮的时间指针currenttime,
33.currenttime=exp iredtime-(exp iredtime%tickms)
ꢀꢀꢀ
(6)
34.如果当前时间轮存在外层时间轮,则把当前时间轮的时间指针currenttime作为过期时间exp iredtime,继续更新外层时间轮的时间指针,此过程为递归的更新时间轮指针。
35.进一步的,同一个bucket中延时任务过期时间并不一致,相差范围为tickms,时间轮指针更新后,需要重新执行添加任务流程,将外层时间轮上的任务列表降级到时间粒度更细内层时间轮上,直到无法降级到最内层时间轮时执行延时任务;取出bucket所有任务之后要将bucket过期时间置为初始值-1。
36.一种延时任务实现装置,包括:至少一个存储器和至少一个处理器;
37.所述至少一个存储器,用于存储机器可读程序;
38.所述至少一个处理器,用于调用所述机器可读程序,执行一种处理延时任务的方法。
39.本发明的一种处理延时任务的方法及装置和现有技术相比,具有以下突出的有益效果:
40.本发明相对于定时轮询方式,时间精度更高,并且占用资源少,时间轮采用多层结构,增大整体时间跨度,可承接大量延时任务。无须引入其他组件,不会提高系统复杂度、造成资源浪费。
附图说明
41.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
42.附图1是一种处理延时任务的方法的结构示意图。
具体实施方式
43.为了使本技术领域的人员更好的理解本发明的方案,下面结合具体的实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例都属于本发明保护的范围。
44.下面给出一个最佳实施例:
45.如图1所示,本实施例中的一种处理延时任务的方法,采用多层的时间轮,一层时间轮底层数据结构为一个环形数组,数组中每个位置代表时间轮中的一个槽,所述槽用于存放延时任务;
46.所述时间轮还包括一个时间指针,时间指针指向时间轮中的槽,随着时间推移,时间指针按照一定时间周期沿着时间轮不断移动,当时间指针指向某个槽时,说明该槽内延时任务已过期,需要取出延时任务执行;
47.所述多层时间轮呈钟表式分布,内层时间轮转动一周,外层时间轮转动一格,所述时间轮依次向外扩展,进而增大时间轮跨度。
48.时间轮槽对象为bucke,内部维护过期时间属性和双向链表tasklist,双向链表tasklist用于存放延时任务,过期时间属性初始值为-1。
49.时间轮的时间粒度用tickms表示,代表时间轮转动一个槽需要经过的时间。时间轮大小使用wheelsize表示,即单层时间轮的环形数组长度。为了提高延时任务所处时间轮
槽中位置的计算效率,wheelsize设置为2的指数幂,若延时任务过期时间为expiredtime,则延时任务所处时间轮中槽的下标计算公式如下:
50.index=(exp iredtime/tickms)&(wheelsize-1)
ꢀꢀꢀ
(1)
51.其中,index为延时任务所处时间轮中槽的下标。
52.int erval:时间轮跨度,计算方式如下:
53.int erval=tickms
×
wheelsize
ꢀꢀꢀ
(2)
54.当前所述时间轮的时间指针使用currenttime表示,结合时间轮跨度参数int erval判断当前时间轮是否可以存放某个延时任务,若延时任务过期时间为exp iredtime,则exp iredtime必须同时满足以两个条件,才可存放于时间轮中,
55.exp iredtime≥currenttime tickms
ꢀꢀꢀ
(3)
56.exp iredtime≤currenttime int erval
ꢀꢀꢀ
(4)
57.不满足公式(3)则说明延时任务已过期,需要执行此延时任务;不满足公式(4)说明当前时间轮无法容纳此延时任务,此时继续尝试在外层时间轮存放该延时任务;
58.指向外层时间轮的指针使用timewheel,其中,delayqueue指java中原生延时队列,用于存放时间轮槽对象bucket。
59.时间轮初始化需要指定tickms,wheelsize,currenttime,其中currentti为初始化时间轮时的当前时间。在时间轮内部初始化一个延时队列delayqueue,多层时间轮共用同一个delayqueue。同时开启一个后台线程,不断的从延时队列中获取bucket,当获取到bucket时,遍历其存放任务进行处理。当delayqueue中队首bucket未过期或者delayqueue为空时,后台线程进入睡眠状态,防止cpu空转消耗资源。
60.在时间轮添加任务,主要步骤如下:
61.s1、根据公式(4)判断当前时间轮是否可以容纳延时任务;
62.首先根据公式(4)判断当前时间轮是否可以容纳此延时任务,如果可以,根据公式(1)计算延时任务所处时间轮槽下标,根据下标获取槽bucket,然后在该bucket中双向链表tasklist中尾部添加任务。
63.s2、计算出bucket过期时间;
64.根据如下公式(5)计算出bucket过期时间。然后判断bucket当前的过期时间是否与计算出过期时间一致,如果一致则执行步骤s3,否则更新bucket过期时间,然后将bucket添加到delayqueue中。如果一致,则说明bucket已在delayqueue中。
65.exp iredtime
bucket
=exp iredtime
task-exp iredtime
task
%tickms
ꢀꢀꢀ
(5)
66.s3、根据公式(3)判断任务是否已经过期;
67.如果已经过期,则将延时任务放入异步线程池执行任务。如果未过期,假如当前时间轮存在外层时间轮,则继续向外层时间轮添加任务,若不存在,则以内层时间轮指针作为外层时间轮指针构造外层时间轮,然后继续向外层时间轮添加任务。
68.在时间轮获取任务时,初始化时间轮开启后台线程,不断地从delayqueue中获取bucket,队首中最先过期的bucket会首先从队列中弹出,设得到bucket的过期时间exp iredtime,根据公式(3)判断时间轮当前能表示的最小过期时间是不是比bucket过期时间小,如果是,按照如下公式(6)更新时间轮的时间指针currenttime,
69.currenttime=exp iredtime-(exp iredtime%tickms)
ꢀꢀꢀ
(6)
70.如果当前时间轮存在外层时间轮,则把当前时间轮的时间指针currenttime作为过期时间expiredtime,继续更新外层时间轮的时间指针,此过程为递归的更新时间轮指针。
71.同一个bucket中延时任务过期时间并不一致,相差范围为tickms,因此bucket过期并不代表bucket中延时任务已过期,因此时间轮指针更新后,需要重新执行添加任务流程,将外层时间轮上的任务列表降级到时间粒度更细内层时间轮上,直到无法降级到最内层时间轮时执行延时任务。取出bucket所有任务之后要将bucket过期时间置为初始值-1。
72.一种延时任务实现装置,包括:至少一个存储器和至少一个处理器;
73.所述至少一个存储器,用于存储机器可读程序;
74.所述至少一个处理器,用于调用所述机器可读程序,执行一种处理延时任务的方法。
75.上述具体的实施方式仅是本发明具体的个案,本发明的专利保护范围包括但不限于上述具体的实施方式,任何符合本发明的一种处理延时任务的方法及装置权利要求书的且任何所述技术领域普通技术人员对其做出的适当变化或者替换,皆应落入本发明的专利保护范围。
76.尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
再多了解一些

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

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

相关文献