一种基于quartz调度框架的任务调度方法、装置、设备及介质与流程

未命名 08-15 阅读:125 评论:0


1.本技术一个或多个实施例涉及大数据技术领域,尤其涉及一种基于quartz调度框架的任务调度方法、装置、设备及介质。


背景技术:

2.quartz是任务调度(job scheduling)领域的一个开源框架,被广泛地应用于任务管理及调度。现有的基于quartz的任务调度方法,通常是为业务系统配置一个全局的调度器(scheduler),然后从业务系统的线程池中获取分配给该全局调度器的线程,以使得全局调度器通过分配的线程进行任务调度。
3.在quartz调度框架中,全局调度器在初始化创建完成之后,其分配到的并发线程数无法随意修改。若想要修改并发线程数,需要重新初始化全局调度器或重新启动quartz调度框架,以使得quartz调度框架与业务系统重新进行交互,从业务系统的线程池中重新获取所需的线程数。这种修改并发线程数的方式会影响正在执行的任务,导致任务执行失败或执行出错。因此,需要一种能够在无需初始化调度器或重启quartz调度框架的前提下,实现在quartz运行过程中动态修改并发线程数的方法。


技术实现要素:

4.本技术提供一种基于quartz调度框架的任务调度方法、装置、设备及介质,以解决相关技术中的不足。
5.根据本技术一个或多个实施例的第一方面,提供一种基于quartz调度框架的任务调度方法,所述quartz调度框架至少包括第一调度器和第二调度器,所述第一调度器和所述第二调度器用于通过线程分别调度不同属性的任务,所述方法包括:
6.获取所述第一调度器的线程占用数量;
7.当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量;
8.当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。
9.可选的,所述方法还包括:对所述第一调度器、所述第二调度器进行初始化处理,所述初始化处理包括:对所述第一调度器设置所述并发线程数和第一线程处理类,以及对所述第二调度器设置所述并发线程数和第二线程处理类;所述按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数,包括:调用所述第一线程处理类增大所述第一调度器的并发线程数,并调用所述第二线程处理类减小所述第二调度器的并发线程数。
10.可选的,所述第一线程处理类包括线程增大处理类,所述第二线程处理类包括线程减小处理类;所述调用所述第一线程处理类增大所述第一调度器的并发线程数,包括:调
用所述线程增大处理类增大所述第一调度器的并发线程数;所述调用所述第二线程处理类减小所述第二调度器的并发线程数,包括:调用所述线程减小处理类减小所述第二调度器的并发线程数。
11.可选的,所述第二调度器的数量为至少两个,所述方法还包括:分别确定所述至少两个第二调度器中未占用线程的数量;基于所述未占用线程的数量对所述至少两个第二调度器进行排序,并基于排序结果选取目标调度器,以按照所述预设数值减小所述目标调度器的并发线程数。
12.可选的,所述方法还包括:记录所述第一调度器和所述第二调度器的线程信息,以根据所述线程信息获取所述第一调度器的线程占用数量以及所述第二调度器的线程占用数量,所述线程信息包括并发线程数、已占用线程数和未占用线程数。
13.可选的,在获取所述第一调度器的线程占用数量之前,还包括:判断是否启动线程调整机制;所述获取所述第一调度器的线程占用数量,包括:在启动所述线程调整机制的情形下,获取所述第一调度器的线程占用数量。
14.可选的,所述方法还包括:在未启动所述线程调整机制的情形下,根据所述为所述第一调度器设置的并发线程数、所述为所述第二调度器设置的并发线程数分别调度所述不同属性的任务。
15.可选的,所述判断是否启动线程调整机制,包括:获取所述线程调整机制对应的指示标识;在所述指示标识为第一标识的情形下,确定启动所述线程调整机制;在所述指示标识为第二标识的情形下,确定关闭所述线程调整机制。
16.可选的,在判断是否启动线程调整机制之前,所述方法还包括:获取所述第一调度器的并发线程数以及所述第一调度器对应的任务信息;在所述第一调度器的并发线程数未达到预设线程数阈值,和/或,在所述任务信息表明预设时长内所述第一调度器调度的任务数量发生变化的情形下,将所述指示标识置为所述第一标识;在所述第一调度器的并发线程数达到所述预设线程数阈值,和/或,在所述任务信息表明所述预设时长内所述第一调度器调度的任务数量未发生变化的情形下,将所述指示标识置为所述第二标识。
17.可选的,所述在所述任务信息表明预设时长内所述第一调度器调度的任务数量发生变化的情形下,将所述指示标识置为所述第一标识,包括:在所述任务信息表明所述预设时长内所述第一调度器调度的任务数量发生变化,且所述任务数量在所述预设时长内变化频率达到预设阈值的情形下,将所述指示标识置为所述第一标识。
18.根据本技术一个或多个实施例的第二方面,提供一种基于quartz调度框架的任务调度装置,所述quartz调度框架至少包括第一调度器和第二调度器,所述第一调度器和所述第二调度器用于通过线程分别调度不同属性的任务,所述装置包括:
19.第一获取单元,用于获取所述第一调度器的线程占用数量;
20.第二获取单元,用于当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量;
21.线程调整单元,用于当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。
22.根据本技术一个或多个实施例的第三方面,提供一种电子设备,包括:
23.处理器;
24.用于存储处理器可执行指令的存储器;
25.其中,所述处理器通过运行所述可执行指令以实现如上述第一方面的实施例中所述的方法。
26.根据本技术一个或多个实施例的第四方面,提供一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如上述第一方面的实施例中所述方法的步骤。
27.由以上技术方案可见,本技术一个或多个实施例中,通过采用至少两个调度器来分别调度不同属性的任务,从而在所述至少两个调度器的并发线程数总和不变的前提下,可以实现灵活调整分配至每个调度器的并发线程数,即实现动态修改每个调度器的并发线程数。并且所述至少两个调度器的并发线程数总和不变,意味着无需改动从业务系统的线程池中初始分配至所述至少两个调度器的并发线程数总和,即无需与业务系统重新进行交互,从而也就无需初始化调度器或重新启动quartz调度框架。可见,本技术的技术方案可以在不影响正在执行的任务的情况下,实现动态修改调度器的并发线程数。
28.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。
附图说明
29.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
30.图1是本技术一示例性实施例提供的一种quartz调度框架的体系结构示意图。
31.图2是本技术一示例性实施例提供的一种基于quartz调度框架的任务调度方法的流程示意图。
32.图3是本技术一示例性实施例提供的一种初始化调度器的流程示意图。
33.图4是本技术一示例性实施例提供的一种任务启动的流程示意图。
34.图5是本技术一示例性实施例示出的一种电子设备的结构示意图。
35.图6是本技术一示例性实施例示出的一种基于quartz调度框架的任务调度装置的框图。
具体实施方式
36.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
37.需要说明的是:在其他实施例中并不一定按照本技术示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本技术所描述的更多或更少。此外,本技术中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本技术中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。应当理解,尽管在本技术可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应
限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本技术范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
38.在任务调度场景中,需要为任务分配线程,以基于分配的线程来调度任务。由于任务调度过程中,不同属性的任务数量会发生变化,其调度所需的线程数也会发生变化。当初始分配的并发线程数无法满足任务的调度需求,即没有可用的空闲线程时,待调度的任务会进入队列等待被调度,这就会导致任务产生执行时延。为了提高任务的调度及执行效率,需要修改调度器的并发线程数,以使得有更多可用线程能够分配给任务。但基于quartz调度框架进行任务调度时,quartz调度框架中的全局调度器在初始化创建完成之后,无法随意修改该调度器的并发线程数。若想要修改并发线程数,需要重新初始化全局调度器或重新启动quartz调度框架。而重新初始化全局调度器或重新启动quartz调度框架会对正在执行的任务造成影响,导致正在执行的任务执行出错或执行失败。
39.有鉴于此,本技术提出一种基于quartz调度框架的任务调度方法,可以在无需初始化调度器或重启quartz调度框架的前提下,实现在quartz运行过程中动态修改调度器的并发线程数。
40.接下来对本技术一个或多个实施例进行详细说明。
41.图1是一示例性实施例示出的一种quartz调度框架的体系结构示意图。如图1所示,在本技术的方案中,quartz调度框架中至少包括第一调度器、第二调度器。第一调度器和第二调度器用于通过分配的线程分别调度不同属性的任务(job)。如图1所示,第一调度器负责调度属性a的任务(简称“a任务”),第二调度器负责调度属性b的任务(简称“b任务”)。第一调度器和第二调度器的线程来自业务系统的线程池,由业务系统在初始化处理各调度器时给各调度器分配线程。此外,quartz调度框架中还包括触发器(trigger),用于定义任务调度的时间规则。各调度器需要根据触发器定义的时间规则调度任务。一个任务可以被多个触发器关联,但一个触发器只能关联一个任务。因为quartz调度框架中调度器、触发器、任务之间是松耦合的,因此在quartz运行中动态修改调度器的并发线程数,不会对正在执行的任务和触发器造成影响。
42.图2是一示例性实施例示出的一种基于quartz调度框架的任务调度方法的流程示意图。如图2所示,该方法可以包括以下步骤:
43.s201,获取所述第一调度器的线程占用数量。
44.结合图1所示实施例,在quartz运行过程中,当新启动一个a任务时,通过获取第一调度器的线程占用数量,可以判断出第一调度器当前是否存在可以用于调度该a任务的未占用线程。
45.s202,当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量。
46.某个调度器的并发线程数是指该调度器在同一时刻所能使用的最大线程数。通常,会在调度器初始化处理时,为调度器设置并发线程数,然后根据该并发线程数向业务系统请求所需的线程。对不同调度器而言,可以设置相等的并发线程数,也可以设置不相等的并发线程数,本领域技术人员可以根据实际需求自行设置,本技术不对此做限定。举例而
言,当为第一调度器设置的并发线程数为8个线程,为第二调度器设置的并发线程数为6个线程,那么在调度器初始化处理阶段,需要向业务系统请求分配8个线程至第一调度器,分配6个线程至第二调度器。当调度器初始化处理结束之后,第一调度器在同一时刻最多仅能使用8个线程,第二调度器在同一时刻最多仅能使用6个线程。
47.并发线程数等于已占用线程数与未占用线程数之和。当s201中获取的第一调度器的线程占用数量没有达到为第一调度器设置的并发线程数时,说明第一调度器中存在未占用线程,可以通过该未占用线程调度新启动的a任务。当第一调度器的线程占用数量达到了为第一调度器设置的并发线程数时,说明初始化处理时分配给第一调度器的线程均已被占用,第一调度器当前已无线程可以用于调度任务。此种情况下,需要获取第二调度器的线程占用数量。
48.s203,当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。
49.当第二调度器的线程占用数量没有达到为第二调度器设置的并发线程数时,说明此时的第二调度器中存在未占用线程。因此,可以增大第一调度器的并发线程数并减小第二调度器的并发线程数,以使得第一调度器和第二调度器的线程数总和保持不变。可以理解为将第二调度器的未占用线程重新分配至第一调度器,以使得第一调度器可以通过新分配的未占用线程调度新启动的a任务。
50.具体的,可以按照预设数值增大第一调度器的并发线程数并减小第二调度器的并发线程数。结合图1所示实施例,假定第一调度器无线程可用,而第二调度器的线程占用数量为2个。说明第二调度器中存在4个未占用线程。当新启动一个a任务,预设数值为2个时,可以将第一调度器的并发线程数增大2个,以及将第二调度器的并发线程数减小2个。第一调度器得到新分配的两个未占用线程后,选择其中一个未占用线程来调度新启动的a任务,此时第一调度器还剩余一个未占用线程,可以用于后续其他任务的调度。前述情况中,由于预设数值大于新启动的任务数量,因此可以通过少量或一次修改线程的操作满足第一调度器的任务调度需求,避免频繁修改第一调度器和第二调度器的并发线程数。
51.若新启动两个a任务,而预设数值为1个的情况下,当按照预设数值将第一调度器的并发线程数增大至9个,以及将第二调度器的并发线程数减小至5个,可以确定增大后的并发线程数仍然无法满足第一调度器的任务调度需求。因此,需再次按照预设数值将第一调度的并发线程数增大至10个,以及将第二调度器的并发线程数减小至4个,从而使得新启动的两个a任务都能够有线程可用。前述情况中,由于预设数值小于新启动的任务数量,因此可以避免第一调度器的并发线程数一次性增大过多以及第二调度器的并发线程数一次性减小过多,导致后续第二调度器的并发线程数无法满足其自身的任务调度需求。当然,预设数值也可以与新启动的任务数量相等,本领域技术人员可以自行设置预设数值,本技术不对此进行限定。
52.需要注意的是,本技术中的第一调度器和第二调度器是相对的概念。当第二调度器的线程占用数量达到为其设置的并发线程数时,可以在第一调度器存在未占用线程的情况下,按照预设数值增大第二调度器的并发线程数并减小第一调度器的并发线程数。
53.在本技术的技术方案中,通过在quartz框架中初始化并启动至少两个调度器,当
某一调度器的线程数无法满足任务调度需求时,可以在另一调度器存在未占用线程的情况下,增大某一调度器的并发线程数并减小另一调度器的并发线程数,从而实现灵活调整分配至每个调度器的线程数,使得待调度任务能够有可用线程被调度,提高了任务的执行效率以及线程的利用率。并且,该修改线程的方式发生在quartz调度框架内部,第一调度器和第二调度器的并发线程数总和不变,也就是说无需从业务系统的线程池中再次获取线程,从而也就无需初始化调度器或重新启动quartz调度框架,有效避免了动态修改调度器并发线程数对正在执行的任务造成的影响。
54.在一些实施例中,启动调度器进行任务调度之前,需要对调度器进行初始化处理。具体的,需要对第一调度器设置并发线程数和第一线程处理类,以及对第二调度器设置并发线程数和第二线程处理类。第一线程处理类和第二线程处理类既保留了quartz调度框架原先所能实现的所有接口,同时新增了扩容接口和缩容接口。扩容接口用于实现线程扩容(即增大线程数),缩容接口用于实现线程缩容(即减小线程数)。因此,调度器初始化处理结束后、启动任务调度的过程中,可以通过调用第一线程处理类来增大第一调度器的并发线程数,以及调用第二线程处理类来减小第二调度器的并发线程数。本实施例中,通过新增扩容/缩容接口的方式实现线程数的动态修改,有效保留了quartz调度框架自身所能实现的所有接口的功能,避免了quartz调度框架原本功能的丢失。
55.在一些实施例中,第一线程处理类包括线程增大处理类,第二线程处理类包括线程减小处理类。因此,通过调用第一线程处理类来增大第一调度器的并发线程数,以及调用第二线程处理类减小第二调度器的并发线程数,具体是通过调用了第一线程处理类中的线程增大处理类来增大第一调度器的并发线程数,以及通过调用了第二线程处理类中的线程减小处理类来减小第二调度器的并发线程数。线程增大处理类的具体执行逻辑为:创建一个新的线程,并将该新线程加入至调度器的未占用线程列表以及该调度器的并发线程数列表。线程减小处理类的具体执行逻辑为:判断调度器是否存在未占用线程;若存在未占用线程,则将未占用线程从该调度器的未占用线程列表中移除,同时将该未占用线程从该调度器的并发线程数列表中移除。
56.在一些实施例中,获取第一调度器、第二调度器的线程占用数量具体可以从第一调度器、第二调度器的线程信息中获取。所述线程信息包括并发线程数、已占用线程数和未占用线程数。对同一调度器而言,并发线程数等于已占用线程数和未占用线程数之和。随着任务调度过程的推进,记录各调度器的线程信息,在未动态修改并发线程数时,已占用线程数和未占用线程数处于此消彼长的关系。在动态修改并发线程数之后,根据并发线程数的修改方式相应修改已占用线程数或未占用线程数。比如,第一调度器的并发线程数增大3个后、但未使用增加的线程调度任务之前,线程信息中未占用线程数需增大3个,已占用线程数不变。当使用了一个增加的线程调度任务之后,未占用线程数需减少一个,已占用线程数增加一个。
57.在一些实施例中,第二调度器的数量可以为至少两个,即quartz调度框架中可以启动多个(至少三个)调度器。多个第二调度器可以用于调度同一属性的任务,也可以用于调度不同属性的任务。只要保证多个第二调度器与第一调度器的并发线程数总和不变,仍然可以基于本技术的方案动态修改调度器的并发线程数。并且当存在多个第二调度器时,在确定第一调度器的线程占用数量达到为其设置的并发线程数时,可以先分别确定多个第
二调度器的未占用线程的数量,然后从存在未占用线程的第二调度器中任选一个第二调度器进行并发线程数的减小。
58.具体的,可以根据第二调度器的未占用线程数量对多个第二调度器进行排序,然后根据排序结果选取要减小并发线程数的目标调度器,以按照预设数值减小目标调度器的并发线程数。比如,初始化并启动4个第二调度器和1个第一调度器。当第一调度器无线程可用时,确定出4个第二调度器(编号顺序为
①②③④
)的未占用线程的数量分别为0、2、3、1。进行排序后,排序结果如表1所示:
[0059][0060][0061]
表1
[0062]
据表1可知,存在未占用线程的是第二调度器
②③④
。其中,第二调度器

的未占用线程数量最多,因此可以先减小第二调度器

中并发线程数,同时增大第一调度器的并发线程数,以满足第一调度器的任务调度需求。若第二调度器

减小了3个线程、第一调度器增加了3个线程后,仍无法满足第一调度器的调度需求,则可以减小第二调度器

的并发线程数,来继续增大第一调度器的并发线程数。本实施例中通过先从未占用线程数量最多的第二调度器减小并发线程数,可以使得未占用线程数量相对较少的第二调度器保留自身的未占用线程,以用于后续第二调度器自身的任务调度,避免出现第二调度器的并发线程数过少,导致第二调度器负责调度的任务无法被调度、出现执行时延的情况。
[0063]
在一些实施例中,并不是所有任务调度场景都需要修改调度器的并发线程数。以数据集成场景为例,数据集成场景中待调度的任务分为流式任务和批式任务。批式任务的调度间隔通常在分钟级以上,即批式任务需要间隔较长的时间触发一次执行,每次执行完毕后,批式任务会释放出线程给其他任务使用。流式任务中包括实时任务。实时任务的调度间隔为秒级,即实时任务会被频繁触发执行,一般可以认为实时任务几乎长期占用线程,不会释放线程给其他任务使用。因此,需要控制实时任务的启动数量。当使用第一调度器调度实时任务、使用第二调度器调度批式任务时,如果第一调度器和第二调度器的并发线程数总和为10个,且第一调度器的并发线程数为7个,第二调度器的并发线程数为3个。那么,为了保证批式任务的执行效率,第二调度器的并发线程数无法再减少。此种情况下,quartz调度框架不会启动线程调整机制。
[0064]
因此,在获取第一调度器的线程占用数量之前,需要判断quartz调度框架是否启动了线程调整机制。只有在启动线程调整机制的情形下,才获取第一调度器的线程占用数量,并在第一调度器的线程占用数量达到为其设置的并发线程数、且第二调度器存在未占用线程时,增大第一调度器的并发线程数并减小第二调度器的并发线程数。在未启动线程调整机制的情形下,第一调度器和第二调度器的并发线程数无法修改,只能根据为第一调度器设置的并发线程数、以及为第二调度器设置的并发线程数分别调度不同属性的任务。
[0065]
本实施例中,通过判断线程调整机制启动与否,可以避免第一调度器和第二调度器中某一调度器的并发线程数过多,而另一调度器的并发线程数过少的情况,从而有助于使得不同属性的任务都能够有可用线程进行调度。
[0066]
在一些实施例中,判断是否启动线程调整机制的方式具体可以为设置线程调整机制对应的指示标识,通过获取指示标识来判断是否需要启动线程调整机制。比如,指示标识可以包括第一标识和第二标识。在获取到的指示标识为第一标识的情形下,确定启动线程调整机制;在获取到的指示标识为第二标识的情形下,确定关闭线程调整机制。本实施例中,通过设置指示标识来指示线程调整机制的动态启用,可以直观快速地判断出是否启动线程调整机制。
[0067]
在一些实施例中,可以通过第一调度器的并发线程数以及第一调度器对应的任务信息来判断是否启动线程调整机制。一方面,当第一调度器的并发线程数未达到预设线程数阈值,说明此时第一调度器、第二调度器的并发线程数处于一种比较均衡的状态,因此可以将指示标识置为第一标识来开启线程调整机制,以在第一调度器无线程可用且第二调度器存在未占用线程的情况下动态修改第一调度器、第二调度器的并发线程数,以满足第一调度器的任务调度需求。比如,在第一调度器和第二调度器的并发线程数总和为10个线程,第一调度器的预设线程数阈值为7个线程的情况下,当第一调度器、第二调度器的并发线程数均为5个时,可以开启线程调整机制。
[0068]
当第一调度器的并发线程数达到预设线程数阈值7个时,此时第二调度器的并发线程数仅为3个。无论此时第二调度器是否存在未占用线程,为了保证第二调度器能够留有足够的线程以供其自身负责调度的任务使用,需要将指示标识置为第二标识来关闭线程调整机制,从而使得第二调度器的并发线程数不再减少,相应的,第一调度器的并发线程数也不再增加。上述两种情况说明了线程调整机制需要在第二调度器具备线程修改条件(即第二调度器有未占用线程富余)的情况下开启,以同时保证第一调度器和第二调度器分别调度的任务的执行效率。
[0069]
另一方面,当第一调度器的任务信息表明预设时长内第一调度器的任务数量发生了变化,即预设时长内第一调度器有新增任务需要调度或者有正在执行的任务执行结束,说明第一调度器的线程数需求发生了变化,此时可以将指示标识置为第一标识来开启线程调整机制。若是预设时长内第一调度器有新增任务且当前第一调度器的并发线程数无法满足新增任务的调度需求时,可以通过线程调整机制动态增大第一调度器的并发线程数并减小第二调度器的并发线程数,使得新增任务能够有线程可用。若是预设时长内第一调度器有正在执行的任务执行结束,那么该执行结束的任务会释放出线程。此种情况下,可以通过线程调整机制动态减小第一调度器的并发线程数并增大第二调度器的并发线程数,以将第一调度器的未占用线程分配给第二调度器使用。
[0070]
当第一调度器的任务信息表明预设时长内第一调度器的任务数量没有发生变化,即预设时长内第一调度器的线程数需求没有发生变化,不存在动态修改并发线程数的需求,那么可以将指示标识置为第二标识来关闭线程调整机制,以节约系统资源。上述两种情况说明了线程调整机制需要在第一调度器有线程修改需求的情况下开启。
[0071]
本实施例中,通过动态启用线程调整机制,进而实现在有线程修改需求和/或具备线程修改的条件时,动态修改调度器的并发线程数。在不具备线程修改条件和/或没有线程
修改需求时,不修改调度器的并发线程数,节约系统资源。
[0072]
在一些实施例中,还可以进一步根据预设时长内第一调度器所调度的任务数量的变化频率来判断是否启动线程调整机制。当预设时长内第一调度器的任务数量的变化频率未达到预设阈值时,表明第一调度器的任务数量变化较少。在某些任务数量变化较少的场景中,当前第一调度器的并发线程数可以满足任务数量发生变化后的任务调度需求,因此无需开启线程调整机制。举个例子,假定第一调度器当前的并发线程数为8个线程,已占用线程数为3个线程,未占用线程数为5个线程,任务数量变化频率的预设阈值为4个/分钟。当某一段预设时长(假定1分钟)内第一调度器新增2个任务需要调度,即第一调度器任务数量的变化频率为2个/分钟,未达到预设阈值。显然,新增的2个任务通过第一调度器中的任意2个未占用线程进行调度即可,无需增大第一调度器的并发线程数,即无需开启线程调整机制。
[0073]
当预设时长内第一调度器的任务数量的变化频率达到预设阈值时,表明第一调度器的任务数量变化较多(即新增较多任务需要调度或存在较多正在执行的任务结束执行),也就是说第一调度器的线程数需求变化幅度较大,此种情况下可以开启线程调整机制,通过动态修改第一调度器和第二调度器的并发线程数来满足各调度器的任务调度需求。结合前述实施例(假定第一调度器当前的并发线程数为8个线程,已占用线程数为3个线程,未占用线程数为5个线程,任务数量变化频率的预设阈值为4个/分钟),当预设时长(1分钟)内第一调度器新增6个任务需要调度,即第一调度器任务数量的变化频率为6个/分钟,超过了预设阈值。可见,此时第一调度器的并发线程数已无法满足该6个新增任务的调度需求,因此可以开启线程调整机制,以增大第一调度器的并发线程数。
[0074]
本实施例中,根据预设时长内第一调度器所调度的任务数量的变化频率来判断是否启动线程调整机制,可以避免一旦任务数量发生变化就立即启动线程调整机制的情况,即避免频繁启动或关闭线程调整机制,有助于节约系统资源。
[0075]
以数据集成场景中的实时任务和批式任务为例,图3是一示例性实施例示出的一种初始化调度器的流程示意图,如图3所示,初始化调度器可以包括以下步骤:
[0076]
s301,获取或创建第一调度器、第二调度器。
[0077]
从quartz调度框架的调度工厂(scheduler factory)中获取或创建两个调度器,其中第一调度器用于调度实时任务,第二调度器用于调度批式任务(本技术中除实时任务以外的流式任务当作批式任务处理)。
[0078]
s302,分别配置第一调度器、第二调度器的调度器信息,所述调度器信息包括线程处理类以及并发线程数。
[0079]
为第一调度器配置第一线程处理类并设置并发线程数为6个,为第二调度器配置第二线程处理类并设置并发线程数为5个。其中,第一线程处理类可以包括线程增大处理类和线程减小处理类,第二线程处理类可以包括线程减小处理类和线程增大处理类。
[0080]
s303,调用quartz调度框架的启动(start)方法启动第一调度器、第二调度器。
[0081]
调度器启动完成后,可以对实时任务和批式任务进行调度。图4是一示例性实施例示出的一种任务启动的流程示意图,如图4所示:
[0082]
s401,启动一个任务p。
[0083]
s402,判断任务p的任务属性。
[0084]
若任务p为实时任务,说明任务p由第一调度器负责调度,则跳转至s403a;若任务p为批式任务,说明任务p由第二调度器负责调度,则跳转至s403b。
[0085]
s403a,在任务p为实时任务的情形下,判断是否启用线程调整机制。
[0086]
如前所述,可以根据第一调度器的并发线程数和第一调度器的任务信息判断是否启用线程调整机制。若启用线程调整机制,则跳转至s404a;若不启用线程调整机制,则跳转至s404b。
[0087]
s403b,在任务p为批式任务的情形下,判断是否启用线程调整机制。若启用线程调整机制,则跳转至s411;若不启用线程调整机制,由于批式任务在每次执行结束后会释放出线程给其他任务使用,因此无论第二调度器中是否存在未占用线程,都可以将任务p分配至第二调度器中,跳转至s416即可。
[0088]
s404a,在启用线程调整机制的情形下,获取第一调度器的线程占用数量。
[0089]
s404b,在未启用线程调整机制的情形下,获取第一调度器的线程占用数量。
[0090]
s405a,判断获取到的第一调度器的线程占用数量是否达到为第一调度器设置的并发线程数。
[0091]
若第一调度器的线程占用数量达到了为其设置的并发线程数,说明当前第一调度器中不存在可用于调度任务p的未占用线程,需跳转至s406。若第一调度器的线程占用数量未达到为其设置的并发线程数,说明当前第一调度器中存在可用于调度任务p的未占用线程,因此可以用第一调度器中的未占用线程调度任务p,跳转至s409即可。
[0092]
s405b,判断获取到的第一调度器的线程占用数量是否达到为第一调度器设置的并发线程数。
[0093]
若第一调度器的线程占用数量达到了为其设置的并发线程数,说明当前第一调度器中不存在可用于调度任务p的未占用线程。由于未启用线程调整机制,因此无法修改第一调度器的并发线程数。所以任务p提交失败,需跳转至s410。若第一调度器的线程占用数量未达到为其设置的并发线程数,说明当前第一调度器中存在可用于调度任务p的未占用线程,因此可以用第一调度器中的未占用线程调度任务p,跳转至s409即可。
[0094]
s406,获取第二调度器的线程占用数量。
[0095]
s407,判断第二调度器的线程占用数量是否达到为第二调度器设置的并发线程数。
[0096]
若第二调度器的线程占用数量达到了为其设置的并发线程数,说明当前第二调度器中不存在未占用线程。即第一调度器、第二调度器均不存在未占用线程,因此任务p无法被调度执行,此种情况下,任务p提交失败,跳转至s410。若第二调度器的线程占用数量未达到为其设置的并发线程数,说明第二调度器中存在未占用线程。由于启动了线程调整机制,因此可以动态修改第一调度器和第二调度器的并发线程数,此种情况下,跳转至s408。
[0097]
s408,按照预设数值增大第一调度器的并发线程数并减小第二调度器的并发线程数。
[0098]
s409,将任务p分配至第一调度器。
[0099]
在任务p为实时任务且第一调度器中存在可用于调度任务p的未占用线程的情形下,可以将任务p分配至第一调度器。
[0100]
s410,报错,作业提交失败。
[0101]
当第一调度器中不存在可用于调度任务p的未占用线程时,任务p无法被调度执行,因此需要提示用户作业提交失败。
[0102]
s411,在任务p为批式任务且启用了线程调整机制的情形下,获取第二调度器的线程占用数量。
[0103]
s412,判断第二调度器的线程占用数量是否达到为第二调度器设置的并发线程数。
[0104]
若第二调度器的线程占用数量达到了为其设置的并发线程数,说明当前第二调度器中不存在可用于调度任务p的未占用线程,需跳转至s413。若第二调度器的线程占用数量未达到为其设置的并发线程数,说明当前第二调度器中存在可用于调度任务p的未占用线程,因此可以基于第二调度器中的未占用线程调度任务p,跳转至s416即可。
[0105]
s413,获取第一调度器的线程占用数量。
[0106]
s414,判断第一调度器的线程占用数量是否达到为第一调度器设置的并发线程数。
[0107]
若第一调度器的线程占用数量达到了为其设置的并发线程数,说明此时第一调度器、第二调度器均不存在未占用线程。由于该情况对应的前提条件是任务p为批式任务,而正在执行的批式任务在每次执行结束后会释放出线程给其他任务使用。因此,即使当前的第一调度器和第二调度器都不存在未占用线程,还是可以将任务p分配给第二调度器,以等待其他正在执行的批式任务执行结束后释放出线程。因此跳转至s416即可。若第一调度器的线程占用数量未达到为其设置的并发线程数,说明此时第一调度器中存在未占用线程。由于启动了线程调整机制,因此可以动态修改第一调度器和第二调度器的并发线程数,需跳转至s415。
[0108]
s415,按照预设数值增大第二调度器的并发线程数并减小第一调度器的并发线程数。
[0109]
s416,当任务p为批式任务时,将任务p分配至第二调度器。
[0110]
s417,当任务p被分配至调度器后,说明任务p提交成功,进入调度中状态,等待触发器触发执行。
[0111]
上述实施例中,通过第一调度器和第二调度器分别调度实时任务和批式任务,并在启用线程调整机制且任一调度器存在未占用线程的情形下动态修改第一调度器和第二调度器的并发线程数,从而满足了调度器的任务调度需求,有助于降低任务的执行时延,同时提高了线程的利用率。
[0112]
与上述方法实施例相对应,本技术还提供了一种装置的实施例。
[0113]
图5是根据本技术一示例性实施例示出的一种电子设备的结构示意图。参考图5,在硬件层面,该电子设备包括处理器502、内部总线504、网络接口506、内存508以及非易失性存储器510,当然还可能包括其他业务所需要的硬件。处理器502从非易失性存储器510中读取对应的计算机程序到内存508中然后运行。当然,除了软件实现方式之外,本技术并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
[0114]
图6是根据本技术一示例性实施例示出的一种基于quartz调度框架的任务调度装置的框图。所述quartz调度框架至少包括第一调度器和第二调度器,所述第一调度器和所
述第二调度器用于通过线程分别调度不同属性的任务。参照图6,该装置包括数据第一获取单元601、第二获取单元602、线程调整单元603,其中:
[0115]
第一获取单元601,被配置为获取所述第一调度器的线程占用数量。
[0116]
第二获取单元602,被配置为当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量。
[0117]
线程调整单元603,被配置为当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。
[0118]
可选的,所述装置还包括:
[0119]
初始化处理单元604,被配置为对所述第一调度器、所述第二调度器进行初始化处理,所述初始化处理包括:对所述第一调度器设置所述并发线程数和第一线程处理类,以及对所述第二调度器设置所述并发线程数和第二线程处理类。
[0120]
所述线程调整单元603具体用于调用所述第一线程处理类增大所述第一调度器的并发线程数,并调用所述第二线程处理类减小所述第二调度器的并发线程数。
[0121]
可选的,所述第一线程处理类包括线程增大处理类,所述第二线程处理类包括线程减小处理类。所述调用所述第一线程处理类增大所述第一调度器的并发线程数,包括:调用所述线程增大处理类增大所述第一调度器的并发线程数;所述调用所述第二线程处理类减小所述第二调度器的并发线程数,包括:调用所述线程减小处理类减小所述第二调度器的并发线程数。
[0122]
可选的,所述第二调度器的数量为至少两个,所述装置还包括:
[0123]
排序单元605,被配置为分别确定所述至少两个第二调度器中未占用线程的数量;基于所述未占用线程的数量对所述至少两个第二调度器进行排序,并基于排序结果选取目标调度器,以按照所述预设数值减小所述目标调度器的并发线程数。
[0124]
可选的,所述装置还包括:
[0125]
记录单元606,被配置为记录所述第一调度器和所述第二调度器的线程信息,以根据所述线程信息获取所述第一调度器的线程占用数量以及所述第二调度器的线程占用数量,所述线程信息包括并发线程数、已占用线程数和未占用线程数。
[0126]
可选的,所述装置还包括:
[0127]
判断单元607,被配置为在获取所述第一调度器的线程占用数量之前,判断是否启动线程调整机制。
[0128]
所述第一获取单元601具体用于在启动所述线程调整机制的情形下,获取所述第一调度器的线程占用数量。
[0129]
可选的,所述装置还包括:
[0130]
调度单元608,被配置为在未启动所述线程调整机制的情形下,根据所述为所述第一调度器设置的并发线程数、所述为所述第二调度器设置的并发线程数分别调度所述不同属性的任务。
[0131]
可选的,所述判断单元607具体用于获取所述线程调整机制对应的指示标识;在所述指示标识为第一标识的情形下,确定启动所述线程调整机制;在所述指示标识为第二标识的情形下,确定关闭所述线程调整机制。
[0132]
可选的,所述装置还包括:
[0133]
标识设置单元609,被配置为在判断是否启动线程调整机制之前,获取所述第一调度器的并发线程数以及所述第一调度器对应的任务信息;在所述第一调度器的并发线程数未达到预设线程数阈值,和/或,在所述任务信息表明预设时长内所述第一调度器调度的任务数量发生变化的情形下,将所述指示标识置为所述第一标识;在所述第一调度器的并发线程数达到所述预设线程数阈值,和/或,在所述任务信息表明所述预设时长内所述第一调度器调度的任务数量未发生变化的情形下,将所述指示标识置为所述第二标识。
[0134]
可选的,所述标识设置单元609具体用于在所述任务信息表明所述预设时长内所述第一调度器调度的任务数量发生变化,且所述任务数量在所述预设时长内变化频率达到预设阈值的情形下,将所述指示标识置为所述第一标识。
[0135]
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0136]
上述实施例阐明的装置或模块,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0137]
本技术还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现如前述任一实施例示出的基于quartz调度框架的任务调度方法。
[0138]
在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
[0139]
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
[0140]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0141]
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0142]
以上所述仅为本技术的较佳实施例而已,并不用以限制本技术,凡在本技术的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本技术保护的范围之内。

技术特征:
1.一种基于quartz调度框架的任务调度方法,其特征在于,所述quartz调度框架至少包括第一调度器和第二调度器,所述第一调度器和所述第二调度器用于通过线程分别调度不同属性的任务,所述方法包括:获取所述第一调度器的线程占用数量;当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量;当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:对所述第一调度器、所述第二调度器进行初始化处理,所述初始化处理包括:对所述第一调度器设置所述并发线程数和第一线程处理类,以及对所述第二调度器设置所述并发线程数和第二线程处理类;所述按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数,包括:调用所述第一线程处理类增大所述第一调度器的并发线程数,并调用所述第二线程处理类减小所述第二调度器的并发线程数。3.根据权利要求2所述的方法,其特征在于,所述第一线程处理类包括线程增大处理类,所述第二线程处理类包括线程减小处理类;所述调用所述第一线程处理类增大所述第一调度器的并发线程数,包括:调用所述线程增大处理类增大所述第一调度器的并发线程数;所述调用所述第二线程处理类减小所述第二调度器的并发线程数,包括:调用所述线程减小处理类减小所述第二调度器的并发线程数。4.根据权利要求1所述的方法,其特征在于,所述第二调度器的数量为至少两个,所述方法还包括:分别确定所述至少两个第二调度器中未占用线程的数量;基于所述未占用线程的数量对所述至少两个第二调度器进行排序,并基于排序结果选取目标调度器,以按照所述预设数值减小所述目标调度器的并发线程数。5.根据权利要求1所述的方法,其特征在于,所述方法还包括:记录所述第一调度器和所述第二调度器的线程信息,以根据所述线程信息获取所述第一调度器的线程占用数量以及所述第二调度器的线程占用数量,所述线程信息包括并发线程数、已占用线程数和未占用线程数。6.根据权利要求1-5项中任一项所述的方法,其特征在于,在获取所述第一调度器的线程占用数量之前,还包括:判断是否启动线程调整机制;所述获取所述第一调度器的线程占用数量,包括:在启动所述线程调整机制的情形下,获取所述第一调度器的线程占用数量。7.根据权利要求6所述的方法,其特征在于,还包括:在未启动所述线程调整机制的情形下,根据所述为所述第一调度器设置的并发线程数、所述为所述第二调度器设置的并发线程数分别调度所述不同属性的任务。8.一种基于quartz调度框架的任务调度装置,其特征在于,所述quartz调度框架至少
包括第一调度器和第二调度器,所述第一调度器和所述第二调度器用于通过线程分别调度不同属性的任务,所述装置包括:第一获取单元,用于获取所述第一调度器的线程占用数量;第二获取单元,用于当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量;线程调整单元,用于当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。9.一种电子设备,其特征在于,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器通过运行所述可执行指令以实现如权利要求1-7中任一项所述的方法。10.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该指令被处理器执行时实现如权利要求1-7中任一项所述方法的步骤。

技术总结
本申请提出了一种基于quartz调度框架的任务调度方法、装置、设备及介质,所述quartz调度框架至少包括第一调度器和第二调度器,所述第一调度器和所述第二调度器用于通过线程分别调度不同属性的任务,所述方法包括:获取所述第一调度器的线程占用数量;当所述第一调度器的线程占用数量达到为所述第一调度器设置的并发线程数时,获取所述第二调度器的线程占用数量;当所述第二调度器的线程占用数量未达到为所述第二调度器设置的并发线程数时,按照预设数值增大所述第一调度器的并发线程数并减小所述第二调度器的并发线程数。通过本申请的方案,可以在无需初始化调度器或重新启动quartz调度框架的前提下,实现灵活调整分配至每个调度器的并发线程数。每个调度器的并发线程数。每个调度器的并发线程数。


技术研发人员:江峰 宋亚红
受保护的技术使用者:杭州数梦工场科技有限公司
技术研发日:2023.05.12
技术公布日:2023/8/14
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐