本发明涉及视屏云平台,具体地说是一种任务执行次序保持方法及实现装置。
背景技术:
1、在视频云平台功能的日常开发中会经常碰到这样一种场景:本视频云平台会以级联的方式对接下级视频云平台,在下级视频云平台初次注册到本视频云平台或者本视频云平台在收到下级视频云平台的固定频次心跳信息后,本视频云平台会向此下级视频云平台下发目录信息查询请求,下级视频云平台在收到本视频云平台的目录查询请求后会响应成功收到本视频云平台的目录信息查询请求,接着下级视频云平台会以一个独立批次任务的形式将所有共享的目录和设备详细信息逐一发送给本视频云平台,本视频云平台接收到下级视频云平台推送的目录和设备信息后,会将它们保存到本地数据库里面,整个过程很符合逻辑。但是在实际环境中经常会出现下级视频云平台向本视频云平台推送的目录和设备信息出现入库失败的情况,排查原因后发现是多线程处理无序任务导致。
技术实现思路
1、本发明的技术任务是针对以上不足之处,提供一种任务执行次序保持方法及实现装置,可以解决下级视频云平台向本视频云平台推送的目录和设备信息因节点存在入库次序问题而导致的入库失败的情况。
2、本发明解决其技术问题所采用的技术方案是:
3、一种任务执行次序保持方法,该方法的实现包括实现任务序号分配功能的任务序号生成器和实现任务排序和执行功能的任务执行器;
4、所述任务序号生成器,负责标识每个独立批次任务和对独立批次任务内的每个待执行子任务分配在此独立批次任务执行过程中的执行序号,它基于concurrenthashmap和atomiclong基础组件来实现;
5、所述任务执行器,负责识别独立批次任务,并对独立批次任务内的每个待执行子任务进行排序,按次序执行每个子任务的功能,它基于delayqueue基础组件和redis中间件来实现。
6、本方法基于concurrenthashmap、atomiclong、delayqueue和redis实现任务执行次序保持,基于concurrenthashmap和atomiclong实现对独立批次任务下的各个子任务分配任务执行序号;对独立批次任务里的各个子任务可以按照独立批次任务内要求的执行次序排序后执行。可以有效解决独立批次任务里包含若干个子任务,这些子任务的执行需要在此批次任务里保持相对执行次序的场景,为业务的正确实现提供了一种可靠的技术解决方案。
7、优选的,所述任务序号生成器,concurrenthashmap以键值对的映射方式标识记录独立批次任务的序号生成器信息,键值对中的值使用atomiclong记录该独立批次任务的最新已分配序号信息;
8、在独立批次任务内的子任务到来时,先获取到该独立批次任务的序号生成器信息,然后给当前到达的子任务分配此独立批次任务内的执行次序号,并把这个子任务通知到有排序功能的任务执行器。
9、优选的,每次有独立批次的新子任务到达时执行以下的判断流程逻辑:
10、检查concurrenthashmap中是否保存有当前到达的子任务所在的独立批次任务的序号生成器信息;
11、否,任务序号生成器初始化当前到达的子任务所在的独立批次任务序号生成器信息,使用atomiclong初始化记录该独立批次任务的最新已分配序号信息,并为当前的子任务分配该独立批次任务里的执行次序号,然后把独立批次任务序号生成器信息保存到concurrenthashmap里,并把此次到达的子任务通知给任务执行器;
12、是,任务序号生成器直接获取到当前到达子任务所在独立批次任务的序号生成器信息,然后给当前到达的子任务分配该独立批次任务里的执行次序号,并更新该独立批次任务的最新已分配序号信息,任务序号生成器最后会更新concurrenthashmap中当前到达的子任务所在独立批次任务的序号生成信息,并把此次到达的子任务通知给任务执行器。
13、优选的,所述任务执行器,接收任务序号生成器通知过来的子任务,然后等待独立批次任务里的所有子任务都到达后再按独立批次任务内次序排序,最后再依序执行独立批次任务里的各个子任务。
14、优选的,所述任务执行器的具体实现如下:
15、在接收到任务序号生成器的新任务通知时,任务执行器会判断当前通知过来的子任务是不是独立批次任务的首次通知子任务,如果是,有排序功能的任务执行器会为当前通知过来的子任务所在的独立批次任务创建一个延时任务对象并保存到delayqueue队列中,然后把子任务保存到redis中;等delayqueue队列中有独立批次任务到期需要执行时,任务执行器从delayqueue中取出到期的独立批次任务,然后从redis中获取到当前到期的独立批次任务内的所有子任务信息,进行排序,最终交由线程池按次序执行。
16、本发明还要求保护一种任务执行次序保持实现装置,包括具有任务序号分配功能的任务序号生成器和具有任务排序和执行功能的任务执行器;
17、所述任务序号生成器,负责标识每个独立批次任务和对独立批次任务内的每个待执行子任务分配在此独立批次任务执行过程中的执行序号,它基于concurrenthashmap和atomiclong基础组件来实现;
18、所述任务执行器,负责识别独立批次任务,并对独立批次任务内的每个待执行子任务进行排序,按次序执行每个子任务的功能,它基于delayqueue基础组件和redis中间件来实现。
19、优选的,所述任务序号生成器,concurrenthashmap以键值对的映射方式标识记录独立批次任务的序号生成器信息,键值对中的值使用atomiclong记录该独立批次任务的最新已分配序号信息;
20、在独立批次任务内的子任务到来时,先获取到该独立批次任务的序号生成器信息,然后给当前到达的子任务分配此独立批次任务内的执行次序号,并把这个子任务通知到有排序功能的任务执行器。
21、优选的,每次有独立批次的新子任务到达时执行以下的判断流程逻辑:
22、检查concurrenthashmap中是否保存有当前到达的子任务所在的独立批次任务的序号生成器信息;
23、否,任务序号生成器初始化当前到达的子任务所在的独立批次任务序号生成器信息,使用atomiclong初始化记录该独立批次任务的最新已分配序号信息,并为当前的子任务分配该独立批次任务里的执行次序号,然后把独立批次任务序号生成器信息保存到concurrenthashmap里,并把此次到达的子任务通知给任务执行器;
24、是,任务序号生成器直接获取到当前到达子任务所在独立批次任务的序号生成器信息,然后给当前到达的子任务分配该独立批次任务里的执行次序号,并更新该独立批次任务的最新已分配序号信息,任务序号生成器最后会更新concurrenthashmap中当前到达的子任务所在独立批次任务的序号生成信息,并把此次到达的子任务通知给任务执行器。
25、优选的,所述任务执行器,接收任务序号生成器通知过来的子任务,然后等待独立批次任务里的所有子任务都到达后再按独立批次任务内次序排序,最后再依序执行独立批次任务里的各个子任务。
26、优选的,所述任务执行器的具体实现如下:
27、在接收到任务序号生成器的新任务通知时,任务执行器会判断当前通知过来的子任务是不是独立批次任务的首次通知子任务,如果是,有排序功能的任务执行器会为当前通知过来的子任务所在的独立批次任务创建一个延时任务对象并保存到delayqueue队列中,然后把子任务保存到redis中;等delayqueue队列中有独立批次任务到期需要执行时,任务执行器从delayqueue中取出到期的独立批次任务,然后从redis中获取到当前到期的独立批次任务内的所有子任务信息,进行排序,最终交由线程池按次序执行。
28、本发明的一种任务执行次序保持方法及实现装置与现有技术相比,具有以下有益效果:
29、本方法基于concurrenthashmap、atomiclong、delayqueue和redis这三个优秀的jdk原生基础组件和高性能的第三方中间件实现了任务执行次序保持装置器功能,有效地解决了独立批次任务里的各个子任务有执行依赖次序的场景问题,也为后续其他类似的场景问题提供了解决方案参考。