定时任务的调度方法及相关设备
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种定时任务的调度方法及相关设备。
背景技术
现有的分布式任务调度系统,基本都实现了任务调度与任务执行分离,即服务端负责任务调度,客户端负责具体任务执行。
这种实现方式,任务调度完全依赖服务端,尽管任务调度系统都会尽量实现和保证服务端高可用,但是在某些特殊情况下,比如服务端依赖的数据库等其它服务不可用时,定时任务没有办法按时触发,或者触发了没有办法通知到客户端,这些都会导致定时任务无法正常执行,进而造成严重的业务影响。
另外,任务调度系统可能同时接入多个应用系统,接入的任务数可能多达上千个,如果分布式任务调度系统只支持服务端调度模式,在服务端任务调度功能不可用时,所有的定时任务都没有办法按时执行,对于业务系统,特别是金融系统,直接影响业务系统中业务的实现。
由上可知,如何解决因依赖于任务调度系统的服务端进行定时任务调度,所导致在服务端异常时定时任务无法执行是现有技术中亟待解决的问题。
发明内容
本申请的实施例提供了一种定时任务的调度方法及相关设备,进而至少在一定程度上可以实现在服务端异常时仍然可以进行定时任务的调度和执行。
本申请的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本申请的实践而习得。
根据本申请实施例的一个方面,提供了一种定时任务的调度方法,应用于客户端,所述方法包括:
在客户端执行服务端所调度任务的过程中,监听自身任务配置信息中的任务调度开关是否由关闭状态切换为开启状态,所述任务配置信息是所述服务端同步至所述客户端的;
若确定所述任务调度开关由关闭状态切换为开启状态,则创建调度器,并将所述任务配置信息中的定时任务添加至所创建的调度器中;
由所述客户端中创建的调度器根据所述定时任务对应的触发条件,触发执行对应的定时任务。
根据本申请实施例的一个方面,提供了一种定时任务的调度装置,应用于客户端,所述装置包括:
监听模块,用于在客户端执行服务端所调度任务的过程中,监听自身任务配置信息中的任务调度开关是否由关闭状态切换为开启状态,所述任务配置信息是所述服务端同步至所述客户端的;
任务添加模块,用于若确定所述任务调度开关由关闭状态切换为开启状态,则创建调度器,并将所述任务配置信息中的定时任务添加至所创建的调度器中;
执行模块,用于由所述客户端中创建的调度器根据所述定时任务对应的触发条件,触发执行对应的定时任务。
在一实施例中,该装置还包括:
任务触发信息接收模块,用于接收服务端为所调度定时任务发送的任务触发信息。
返回模块,用于若客户端的任务配置信息中的任务调度开关为开启状态,则向服务端返回运行失败信息,通过运行失败信息指示客户端已开启本地调度。
在一实施例中,任务触发信息包括任务标识和任务参数,该装置还包括:
第二执行模块,用于若客户端的任务配置信息中的任务调度开关为关闭状态,则根据任务触发信息中的任务参数执行任务标识所指示的定时任务。
在一实施例中,该装置还包括:
获取模块,用于获取由服务端再次同步至自身的任务配置信息;
清除和关闭模块,用于若所再次同步的任务配置信息中的任务调度开关切换为关闭状态,则清除调度器中的定时任务,并关闭调度器。
在一实施例中,任务配置信息中包括至少两个定时任务分别对应的配置信息,配置信息中包括定时任务对应的优先级信息,执行模块750,包括:
优先级信息获取单元,用于在客户端中的调度器根据定时任务对应的触发条件确定在同一时间需要执行至少两个定时任务时,获取待执行至少两个定时任务所分别对应的优先级信息。
任务执行顺序确定单元,用于根据待执行至少两个定时任务所分别对应的优先级信息的指示,确定待执行至少两个定时任务的任务执行顺序。
任务执行单元,用于按照待执行至少两个定时任务的任务执行顺序执行对应的定时任务。
在一实施例中,任务配置信息包括定时任务对应的配置信息,配置信息中包括节假日策略,该装置还包括:
节假日策略获取模块,用于若当前时间为预设的节假日,获取定时任务所对应配置信息中的节假日策略。
第三执行模块,用于由调度器按照节假日策略的指示执行所对应的定时任务。
根据本申请实施例的一个方面,提供了一种电子设备,包括:
处理器;以及
存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,实现如上所述的方法。
根据本申请实施例的一个方面,提供了一种计算机可读存储介质,其上存储有计算机可读指令,所述计算机可读指令被处理器执行时,实现如上的方法。
在本申请的技术方案中,在服务端将任务配置信息同步至客户端并在任务配置信息中配置任务调度开关的基础上,在任务调度开关由关闭状态切换为开启状态时,由客户端创建调度器,开启在客户端本地进行定时任务的调度和执行;而在任务调度开关为关闭状态时,由服务端根据任务配置信息进行定时任务调度,由客户端根据服务端的调度执行对应的定时任务,实现了由服务端进行定时任务调度客户端执行的模式到由客户端进行定时任务调度并执行的模式的转换。
在本申请的方案中,借助于任务配置信息中配置的任务调度开关实现了服务端调度定时任务和客户端调度定时任务两种调度模式之间的切换,由于并不仅仅依赖于服务端进行定时任务调度,从而,可以在服务端出现异常无法实现定时任务调度时,通过修改任务调度开关,切换至客户端调度定时任务的模式,从而避免出现在服务端异常时无法调度定时任务的情况,保证了定时任务调度的有效性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1是根据一实施例示出的定时任务调度方法的流程图;
图2是根据另一实施例示出的定时任务调度方法的流程图;
图3是图1对应实施例的步骤150之后步骤在一实施例中的流程图;
图4是图1对应实施例的步骤150在一实施例中的流程图;
图5是根据另一实施例示出的定时任务调度方法的流程图;
图6是根据一具体实施例示出的定时任务调度方法的流程图;
图7是根据一实施例示出的定时任务调度装置的框图;
图8示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本申请将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
以下对本申请实施例的技术方案的实现细节进行详细阐述:
图1是根据一实施例示出的定时任务的调度方法的流程图,应用于客户端。参照图1所示,该方法至少包括步骤110至步骤150,详细介绍如下:
步骤110,在客户端执行服务端所调度任务的过程中,监听自身任务配置信息中的任务调度开关是否由关闭状态切换为开启状态,任务配置信息是服务端同步至客户端的。
现有任务调度中,是通过将业务系统接入到任务调度系统中,由任务调度系统统一进行任务(包括定时任务)调度。其中,任务调度系统可以接入多个业务系统,业务系统可以是薪资发放系统、清算系统、物料系统等。在此种系统架构下,任务调度系统为所接入的各个业务系统提供任务调度的服务,各个业务系统根据任务调度系统所调度任务执行对应的任务。
值得一提的是,本公开的服务端是指各个业务系统所接入的任务调度系统,而客户端是指接入任务调度系统的业务系统。
现有技术中,为了实现定时任务的自动调度和执行,而不是人工监督和人工触发执行,在服务端配置任务配置信息,通过该任务配置信息来控制服务端自动进行定时任务的调度,并控制接入该服务端的各个客户端执行定时任务。
该任务配置信息可以包括定时任务对应的任务参数、触发条件(例如设定周期)、任务标识、任务执行次数等,其中触发条件用于指示核实触发执行定时任务、任务参数是指用于执行定时任务所需的参数,例如指示需要调用的接口等,任务标识用于标识定时任务。
如上所描述,在一般情况下,由服务端进行定时任务调度,由接入服务端的客户端执行定时任务,也就是说,在服务端确定达到定时任务的触发条件时,由服务端向客户端下发任务触发信息,然后由客户端根据该任务触发信息执行对应的定时任务。
不可避免的是,服务端可能出现异常,例如服务端依赖的数据库等服务不可用,从而导致服务端无法按时触发定时任务,或者触发了不能及时通知到客户端,在该种情况下,导致客户端无法执行定时任务。
为了解决服务端出现异常引起无法按时触发定时任务或者触发了定时任务而不能及时通知到客户端,导致客户端无法执行定时任务的问题,提出了本公开的方法。
在本公开的方法中,服务端将为定时任务配置的任务配置信息同步至客户端中,并且,在任务配置信息中额外配置了任务调度开关,在任务调度开关为关闭状态时,由服务端进行定时任务调度,即按照上述:触发定时任务,并将定时任务对应的任务触发信息下发至客户端,由客户端执行定时任务。
其中,服务端的任务配置信息可以按照设定的时间周期同步至客户端,例如设置每30分钟将任务配置信息同步至客户端。
在一实施例中,在服务端将任务配置信息同步至客户端后,客户端中控制创建调度器的模块可以按照预设的时间间隔,例如每隔一分钟、一小时或者一天等,从任务配置信息中获取任务调度开关对应的参数值,以根据任务调度开关对应的参数值来判断任务调度开关的状态。其中,任务调度开关对应的参数值包括指示任务调度开关为开启状态的参数值和指示任务调度开关为关闭状态的参数值。若当前获取到任务调度开关对应的参数值指示任务调度开关为开启状态,而上一所获取到任务调度开关的参数值指示任务调度开关为关闭状态,则确定任务调度开关由关闭状态切换为开启状态。以上客户端从同步至自身的任务配置信息中按照预设的时间间隔获取任务调度开关对应的参数值即为对任务调度开关的监听。
在另一实施例中,在将任务配置信息同步至客户端后,立即提取任务配置信息中任务调度开关对应的参数值,在新同步任务配置信息中的任务调度开关对应的参数值指示任务调度开关为开启状态而上一次所同步任务配置信息中的任务调度开关对应的参数值指示任务调度开关为关闭状态,则生成提示提示信息,并将该提示信息发送至客户端中控制调度器创建的模块,以使该模块及时获知任务调度开关由关闭状态切换为开启状态。以上在将任务配置信息同步至客户端后,例如提取任务调度开关对应的参数值,并根据所提取的参数值生成提示信息的过程即为对任务调度开关的监听过程。
步骤130,若确定任务调度开关由关闭状态切换为开启状态,则创建调度器,并将任务配置信息中的定时任务添加至所创建的调度器中。
在任务配置信息中的任务调度开关由关闭状态转换为开启状态时,则指示由客户端按照同步至自身的任务配置信息进行定时任务调度和执行,从而,避免出现服务端异常所导致客户端定时任务无法执行的情况。
若客户端在执行服务端所调度定时任务的过程中,监听到自身的任务配置信息中的任务调度开关由关闭状态切换为开启状态,则服务端指示由客户端开启本地调度。
为了实现在客户端中进行定时任务调度,客户端中集成了任务调度工具,基于该任务调度工具,客户端对应进行调度器的创建。其中,该任务调度工具可以是quartz、Timer工具等,在此不进行具体限定。
其中,在任务调度工具中配置了任务调度函数,此处客户端创建调度器,是指客户端调用任务调度工具中的任务调度函数。例如在quartz中配置了quartz scheduler这一任务调度函数,若客户端中集成了该quartz工具,则在监听到任务调度开关被开启时,客户端调用quartz scheduler这一任务调度函数,实现调度器的创建。
任务配置信息指示了所要执行的定时任务,因此,在创建调度器后,将任务配置信息中的定时任务添加至调度器中,以告知客户端的调度器所需要调度的定时任务。
若任务配置信息中的任务调度开关保持为关闭状态,则表明仍然由服务端进行定时任务调度,而客户端负责定时任务执行。
步骤150,由客户端中创建的调度器根据定时任务对应的触发条件,触发执行对应的定时任务。
任务配置信息中包括定时任务对应的配置信息,该配置信息中包括定时任务对应的触发条件、任务参数等信息,基于此,调度器在确定达到定时任务的触发条件时,则对应根据该定时任务对应的任务参数执行该定时任务。
其中,定时任务是指预先设定了执行时间的任务,例如月薪发放任务、每日/每月交易量统计任务、对账任务、清算任务等。可以理解的是,定时任务对应的触发条件即为该定时任务所预先指定的执行时间。举例来说,例如为月薪发放任务所预先设定的执行时间为每月10日的下午五点,该月薪发放任务对应的触发条件即为时间是否达到当月10日的下午五点,在当前时间为当月的10日下午五点,则确定达到该月薪发放任务对应的触发条件。
在步骤150中,实质上存在定时任务调度和定时任务执行的两个过程,由于均是在客户端中执行,由客户端的队列作为定时任务的缓存区,换言之,调度器在确定达到定时任务的触发条件时,则将该定时任务添加至线程队列中实现任务的调度,而在线程从队列中取出该定时任务并执行时,则实现了定时任务的执行。
至此,在服务端将任务配置信息同步至客户端并在任务配置信息中配置任务调度开关的基础上,在任务调度开关由关闭状态切换为开启状态时,由客户端创建调度器,开启在客户端本地进行定时任务的调度和执行;而在任务调度开关为关闭状态时,由服务端根据任务配置信息进行定时任务调度,由客户端根据服务端的调度执行对应的定时任务。
换言之,在本公开的方案中,借助于任务配置信息中配置的任务调度开关实现了服务端调度定时任务和客户端调度定时任务两种调度模式之间的切换,由于并不仅仅依赖于服务端进行定时任务调度,从而,可以在服务端出现异常无法实现定时任务调度时,通过修改任务调度开关,切换至客户端调度定时任务的模式,从而避免出现在服务端异常时无法调度定时任务的情况,保证了定时任务调度的有效性。
可以理解的是,定时任务相较于需要即时调度执行的随机任务而言,由于定时任务的执行具有周期性,从而,给予服务端将定时任务相关的任务配置信息同步至客户端的时间,使得对于定时任务的调度可以在服务端调度和客户端调度两种模式之间切换。
通过本申请的方案,在服务端工作情况正常的情况下,将任务配置信息中的任务调度开关的参数值设定为指示任务调度开关为关闭状态的参数值,此时采用服务端所配置的任务调度工具进行定时任务调度,而由客户端按照服务端进行的调度执行对应的定时任务。
反之,若服务端异常,则将服务端的任务配置信息中的任务调度开关对应的参数变更为指示任务调度开关为开启状态的参数值,并将该任务配置信息同步至客户端后,使客户端根据所同步的任务配置信息启动客户端本地任务调度和执行。
在一实施例中,服务端中接入了配置管理平台,在该配置管理平台中进行任务配置信息的变更,对应的,任务配置信息中任务调度开关所对应参数值的变更也在该配置管理平台中实现。该配置管理平台可以是Apollo配置管理平台。
其中,服务端工作情况的监控可以由运维工程师来实现,也就是说,在运维工程师判断服务端工作异常(例如服务端所依赖数据库不可用)时,运维工程师在配置管理平台的配置界面中修改任务调度开关对应的参数值,然后将修改后的任务配置信息同步至客户端。
在另一实施例中,服务端工作情况的监控可以由服务端中设定的监控模块来自动进行监控,然后根据监控模块的监控结果来确定在配置管理平台配置任务调度开关对应的参数值。具体来说,若监控模块的监控结果指示服务端异常,则确定将任务调度开关对应的参数值配置为指示为开启状态的参数值;反之,则确定将任务调度开关对应的参数值配置为指示关闭状态的参数值。举例来说,针对数据库是否可用的监控,服务端设定数据库监控模块,该数据库监控模块向数据库发送测试信号,并接收由数据库返回的响应信号,数据库监控模块未接收到响应信号或者所接收到的响应信号异常,则确定数据库不可用。
在一实施例中,如图2所示,该方法还包括:
步骤210,接收服务端为所调度定时任务发送的任务触发信息。
该任务触发信息是在达到定时任务的触发条件时,服务端根据所触发的定时任务相关的配置信息生成的,该任务触发信息用于指示客户端所要执行的定时任务以及执行该定时任务所需要的任务参数。因此,可以理解的是,任务触发信息至少包括任务标识和任务参数,任务标识用于唯一标识定时任务。
步骤230,若客户端的任务配置信息中的任务调度开关为开启状态,则向服务端返回运行失败信息,通过运行失败信息指示客户端已开启本地调度。
如果该任务调度开关为开启状态,则表明此时客户端中开启了定时任务的本地调度。
为了避免发生同时出现服务端调度定时任务和客户端调度定时任务的发生,在任务调度开关为开启状态时,由客户端向服务端返回运行失败信息,从而向服务端指示客户端中已启动本地调度。
在一实施例中,任务触发信息包括任务标识和任务参数,步骤210之后,该方法还包括:
若客户端的任务配置信息中的任务调度开关为关闭状态,则根据任务触发信息中的任务参数执行任务标识所指示的定时任务。
如上所描述,在任务配置信息中的任务调度开关为关闭状态时,此时仍然由服务端进行定时任务调度而并未启动客户端的本地调度,此时客户端仅负责定时任务的执行。因此,客户端直接根据所接收到任务触发信息中的任务参数执行任务标识所指示的定时任务。
此种情况下,由服务端调度定时任务,在定时任务被触发时,下发任务触发信息至客户端,由客户端根据任务触发信息执行对应的定时任务,基于服务端和客户端的配合实现定时任务的调度和执行。
在一实施例中,如图3所示,步骤150之后,该方法还包括:
步骤310,获取由服务端再次同步至自身的任务配置信息。
服务端实时地将任务配置信息同步至客户端中,例如按照设定的时间周期进行任务配置信息的同步。客户端在接收到服务端同步的任务配置信息后,必然会实时地再次获得服务端所再次同步的任务配置信息。
步骤330,若所再次同步的任务配置信息中的任务调度开关切换为关闭状态,则清除调度器中的定时任务,并关闭调度器。
如果所再次同步的任务配置信息中的调度开关切换为关闭状态,表明此时服务端已经恢复开始进行定时任务的调度。在此情况下,为了避免出现客户端和服务端同时进行定时任务的调度,客户端停止进行定时任务的调度,即:客户端自动清除调度器中的定时任务,并关闭调度器。
在一实施例中,任务配置信息中包括至少两个定时任务分别对应的配置信息,配置信息中包括定时任务对应的优先级信息,如图4所示,步骤150,包括:
步骤410,在客户端中的调度器根据定时任务对应的触发条件确定在同一时间需要执行至少两个定时任务时,获取待执行至少两个定时任务所分别对应的优先级信息。
在定时任务调度的过程中,不可避免地出现同时达到两个及其以上数量的定时任务的触发条件,在此种情况下,如果客户端中计算资源足够,例如存在多余的线程,则客户端可以分别为每一定时任务分别分配对应的线程,在对应的线程中通知执行对应的定时任务。
反之,如果客户端中计算资源有限,导致无法同时执行多个定时任务,则对于从定时任务对应的配置信息中提取定时任务对应的优先级信息。定时任务的优先级信息用于指示该定时任务的优先级。
在一实施例中,该优先级信息可以是优先级标识。预先为每一执行优先级配置一优先级标识,然后为定时任务配置对应的优先级标识,并将为定时任务所配置的优先级标识添加至定时任务的配置信息中。
步骤430,根据待执行至少两个定时任务所分别对应的优先级信息的指示,确定待执行至少两个定时任务的任务执行顺序。
定时任务对应的优先级信息指示了所对应定时任务的调度优先级,换言之,在调度过程中存在定时任务排队时,优先级高的定时任务优先,而优先级低的定时任务的顺序靠后。
在获得待执行至少两个定时任务所分别对应的优先级信息后,根据每一定时任务所对应的优先级信息所指示的优先级高低确定定时任务的执行顺序,即优先级高的定时任务的顺序先于优先级低的定时任务。若出现优先级相同的两个或者多个定时任务,可以按照随机策略来确定该优先级相同的定时任务的执行顺序。
步骤450,按照待执行至少两个定时任务的任务执行顺序执行对应的定时任务。
至此,实现了按照定时任务对应的优先级信息进行定时任务执行顺序的确定,以及按照对应的任务执行顺序来执行对应的定时任务,有效保证了定时任务的顺序执行。
在一实施例中,任务配置信息包括定时任务对应的配置信息,配置信息中包括节假日策略,如图5所示,该方法还包括:
步骤510,若当前时间为预设的节假日,获取定时任务所对应配置信息中的节假日策略。
步骤530,由调度器按照节假日策略的指示执行所对应的定时任务。
定时任务所对应的节假日策略用于指示在节假日期间,该定时任务的执行触发条件。也就是说,对于定时任务而言,该定时任务在非节假日期间的触发条件和在节假日期间的触发条件可能不同,在此情况下,在节假日期间,则需要按照定时任务对应的节假日策略来进行定时任务的触发和执行。
在其他实施例中,节假日策略还可以指示在节假日期间定时任务对应的任务参数,换言之,在节假日期间,定时任务执行所需的任务参数与非节假日期间定时任务执行所需的任务参数不同,在此情况下,在节假日期间,按照节假日策略所指示的任务参数执行定时任务。
图6是根据一具体实施例示出的定时任务的调度方法的流程图。如图6所示,包括步骤610-670,详细介绍如下:
步骤610,服务端定期将任务配置信息写到Zookeeper中。
步骤620,客户端从Zookeeper中同步任务配置信息并缓存到本地。
在本实施例中,以Zookeeper作为媒介,来实现服务端与客户端之间任务配置信息的同步。其中,Zookeeper是一个为分布式应用提供一致性服务的软件,在本实施例中,其为服务端和客户端所提供的服务包括任务配置信息的同步服务。
在本实施中,可以通过Apollo软件来进行任务配置信息的配置。Apollo软件是一种配置管理中心,能够集中化管理不同应用环境、不同集群的配置,配置修改后能够实施推动到应用端。也就是说,在服务端中通过Apollo软件进行各个定时任务的配置信息的配置,从而得到任务配置信息。
在本实施例中,Apollo配置中至少包括如下的公共信息:
djss.localScheduler.switch:任务调度开关,默认为off(即关闭状态);
djss.localScheduler,zkLockSwitch:任务调度zookeeper锁开关,默认为on;
djss.localScheduler,configSyncInterval:任务配置信息的同步间隔,默认30分钟;
djss.localScheduler.threadCount:客户端调度线程数量,默认为30。
其中,本地调度开关的切换可以由运维工程师在apollo配置界面中进行切换。客户端监听本地调度开关的变化,并在变化时对应同步到客户端本地。
在客户端调度的过程中,若zookeeper锁开关的值为on,则使用zookeeper锁,否则不使用zookeeper锁。通过所打开的zookeeper锁来避免任务并发执行。在其他实施例中,该zookeeper锁还可以是redis锁、数据库锁。其中,zookeeper锁开关的切换由运维工程师在配置界面中进行切换,若监控到zookeeper锁未使用的时间达到设定时间阈值,则生成提示信息,通过该提示信息指示运维工程师进行zookeeper锁开关的切换。
在具体实施例中,服务端按照设定的周期将任务配置信息同步到zookeeper,其目录为/$namespace/client/$bizSysCode/jobConfig。具体的,服务端按照设定条数进行任务配置信息的分割,得到若干个任务配置文件,然后将任务配置文件同步至zookeeper。例如,将任务配置按每150条分割成多个文件,文件名为00_MD5,01_MD5......150_MD5。
任务配置文件内容示例如下:
[{″cron″:″0*/10***?″,″idc″:″ALL″,″jobId″:″″,″jobParams″:″″,″jobType″:2,″lockExpiredTime″:500,″runHoliday″:1,″shardingParams″:″″,″priority″:5};
{″cron″:″0*/30***?″,”idc”:″ALL″,″jobId″:″″,″jobParams”:″″,”jobType″:2,″lockExpiredTime″:500,″runHoliday″:1,″shardingParams″:″″,″priority″:10}]
上述代码中,cron表示任务触发cron表达式;idc表示任务执行集群;jobId表示任务标识;jobType表示任务类型;lockExpiredTim表示锁过期时间;runHoliday表示节假日执行策略;shardingParams表示分片参数;priority表示任务优先级。
在本实施例中,将任务配置信息同步至apollo公共的namespace,从而,当任务配置中的配置项(例如任务调度开关的值、zookeeper锁开关)的值发生变化,客户端主动收到推送,或者客户端定期主动查询,获取到最新的值,从而,无需重启客户端实例便可实现快速切换。
通过该任务配置信息,客户端在调度过程中按照该任务配置信息进行定时任务调度。例如,在两个定时任务均达到触发条件时,按照定时任务的优先级进行调度;又例如在调度器上锁期间,若超过所过期时间,则为调度器进行解锁,从而,该调度器可以继续进行任务调度。
步骤630,检测任务配置信息中任务调度开关是否为开启状态,若任务调度开关为开启状态,则顺次执行步骤640-650;若任务调度开关为关闭状态,则顺次执行步骤660-670。
步骤640,加载任务配置信息,并创建调度器。
步骤650,添加定时任务至调度器中。
在本实施例中,客户端中集成了quartz调度工具,通过该quartz调度工具进行调度器的创建,和控制调度器进行定时任务的调度和执行。
若任务调度开关为关闭状态,则执行:步骤660,清除调度器中的定时任务;步骤670,关闭调度器。
通过如上的过程,实现了由服务端调度的模式切换至由客户端进行定时任务调度的模式,从而可以在服务端异常时,由客户端进行定时任务的调度和执行,有效解决了现有技术中因依赖于服务端进行定时任务调度所导致在服务端出现异常时定时任务无法执行的问题。
以下介绍本申请的装置实施例,可以用于执行本申请上述实施例中的方法。对于本申请装置实施例中未披露的细节,请参照本申请上述的方法实施例。
本公开提供了一种定时任务的调度装置700,应用于客户端,如图7所示,该装置包括:
监听模块710,用于在客户端执行服务端所调度任务的过程中,监听自身任务配置信息中的任务调度开关是否由关闭状态切换为开启状态,任务配置信息是服务端同步至客户端的。
任务添加模块730,用于若确定任务调度开关由关闭状态切换为开启状态,则创建调度器,并将任务配置信息中的定时任务添加至所创建的调度器中。
执行模块750,用于由客户端中创建的调度器根据定时任务对应的触发条件,触发执行对应的定时任务。
在一实施例中,该装置还包括:
任务触发信息接收模块,用于接收服务端为所调度定时任务发送的任务触发信息。
返回模块,用于若客户端的任务配置信息中的任务调度开关为开启状态,则向服务端返回运行失败信息,通过运行失败信息指示客户端已开启本地调度。
在一实施例中,任务触发信息包括任务标识和任务参数,该装置还包括:
第二执行模块,用于若客户端的任务配置信息中的任务调度开关为关闭状态,则根据任务触发信息中的任务参数执行任务标识所指示的定时任务。
在一实施例中,该装置还包括:
获取模块,用于获取由服务端再次同步至自身的任务配置信息;
清除和关闭模块,用于若所再次同步的任务配置信息中的任务调度开关切换为关闭状态,则清除调度器中的定时任务,并关闭调度器。
在一实施例中,任务配置信息中包括至少两个定时任务分别对应的配置信息,配置信息中包括定时任务对应的优先级信息,执行模块750,包括:
优先级信息获取单元,用于在客户端中的调度器根据定时任务对应的触发条件确定在同一时间需要执行至少两个定时任务时,获取待执行至少两个定时任务所分别对应的优先级信息。
任务执行顺序确定单元,用于根据待执行至少两个定时任务所分别对应的优先级信息的指示,确定待执行至少两个定时任务的任务执行顺序。
任务执行单元,用于按照待执行至少两个定时任务的任务执行顺序执行对应的定时任务。
在一实施例中,任务配置信息包括定时任务对应的配置信息,配置信息中包括节假日策略,该装置还包括:
节假日策略获取模块,用于若当前时间为预设的节假日,获取定时任务所对应配置信息中的节假日策略。
第三执行模块,用于由调度器按照节假日策略的指示执行所对应的定时任务。
上述装置中各个模块/单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
可以理解,这些模块可以通过硬件、软件、或二者结合来实现。当以硬件方式实现时,这些模块可以实施为一个或多个硬件模块,例如一个或多个专用集成电路。当以软件方式实现时,这些模块可以实施为在一个或多个处理器上执行的一个或多个计算机程序。
图8示出了适于用来实现本申请实施例的电子设备的计算机系统的结构示意图。
需要说明的是,图8示出的电子设备的计算机系统800仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图8所示,计算机系统800包括中央处理单元(Central Processing Unit,CPU)801,其可以根据存储在只读存储器(Read-Only Memory,ROM)802中的程序或者从存储部分808加载到随机访问存储器(Random Access Memory,RAM)803中的程序而执行各种适当的动作和处理,例如执行上述实施例中的方法。在RAM 803中,还存储有系统操作所需的各种程序和数据。CPU 801、ROM 802以及RAM 803通过总线804彼此相连。输入/输出(Input/Output,I/O)接口805也连接至总线804。
以下部件连接至I/O接口805:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(Cathode Ray Tube,CRT)、液晶显示器(Liquid Crystal Display,LCD)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如LAN(Local Area Network,局域网)卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至I/O接口805。可拆卸介质88,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。
特别地,根据本申请的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本申请的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质88被安装。在该计算机程序被中央处理单元(CPU)801执行时,执行本申请的系统中限定的各种功能。
需要说明的是,本申请实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)、闪存、光纤、便携式紧凑磁盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本申请各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。其中,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
作为另一方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读存储介质存储有计算机可读指令,当上述计算机可读指令被处理器执行时,例如上述电子设备中的处理器执行时,实现上述任一方法实施例中的方法。
应当注意,尽管在上文详细描述中提及了用于动作执行的设备的若干模块或者单元,但是这种划分并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多模块或者单元的特征和功能可以在一个模块或者单元中具体化。反之,上文描述的一个模块或者单元的特征和功能可以进一步划分为由多个模块或者单元来具体化。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本申请实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、触控终端、或者网络设备等)执行根据本申请实施方式的方法。
在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
本领域技术人员在考虑说明书及实践这里公开的实施方式后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。